我正在尝试按最接近的时差获取记录顺序。
我按子句顺序计算了时间差,这会导致性能问题,因为表有大约 2M 记录。
注意:在我的实际查询中,没有连接,表只有 13 列。
获取此示例数据:
CREATE TABLE yourtable
([ID] int, [User] varchar(5), [ScheduleOn] datetime)
;
INSERT INTO yourtable
([ID], [User], [ScheduleOn])
VALUES
(1, 'User1', '2018-01-09 11:50:03.103'),
(2, 'User2', '2018-01-09 11:38:03.103'),
(3, 'User3', '2018-01-09 11:42:03.103'),
(4, 'User4', '2018-01-09 11:45:03.103'),
(5, 'User5', '2018-01-09 11:43:03.103'),
(6, 'User6', '2018-01-09 11:44:03.103'),
(7, 'User7', '2018-01-09 11:40:03.103')
;
这是我的示例查询。
ScheduleOn 是 Datetime 类型。
Declare @currentDate datetime = '2018-01-09 11:42:03.103'
select *, ABS(datediff(mi,@currentDate,ScheduleOn)) AS JustToSee from yourtable
order by ABS(datediff(mi,@currentDate,ScheduleOn))
我想知道,有没有其他的按最近时差排序的记录。
最佳答案
虽然您尚未回复评论中提出的问题,但我认为了解所提及的查询类型可能对您或其他人有所帮助。
给出的示例是昂贵的,因为在 ABS(DATEDIFF())
操作之后,数据被认为是乱序的。这意味着对数据进行排序变得昂贵(排序 200 万行)。
但是,只有那些最接近 @currentDate 值的行才感兴趣,因此在必须应用排序之前可以限制样本大小。
WITH
closest_100_each_side
(
SELECT TOP(100) *, ScheduleOn - @currentDate AS diff FROM yourTable WHERE ScheduleOn >= @currentDate ORDER BY ScheduleOn ASC
UNION ALL
SELECT TOP(100) *, @currentDate - ScheduleOn AS diff FROM yourTable WHERE ScheduleOn < @currentDate ORDER BY ScheduleOn DESC
)
SELECT TOP(100)
*
FROM
closest_100_each_side
ORDER BY
diff ASC
在 ScheduleOn
上使用适当的索引后,CTE 中的两个查询变得微不足道,最终查询现在只需要对 200 行进行排序以找到最接近的 100 行。
这将比简单地将 TOP(100)
应用于现有查询更快。
因此,理解数据的用途、执行查询后数据的实际用途变得极为重要。这一小块信息可能允许对查询进行微小的更改,从而显着提高性能。
关于sql - 按sql server中最近的时差排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48167814/