sql - 按sql server中最近的时差排序

标签 sql sql-server database

我正在尝试按最接近的时差获取记录顺序。

我按子句顺序计算了时间差,这会导致性能问题,因为表有大约 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))

我想知道,有没有其他的按最近时差排序的记录。

SQL Fiddle

最佳答案

虽然您尚未回复评论中提出的问题,但我认为了解所提及的查询类型可能对您或其他人有所帮助。

给出的示例是昂贵的,因为在 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/

相关文章:

sql - SysIndex - is_unique 和 is_unique_constraint 的黑白差异

c# - 如何在不同线程中使用 Entity Framework ?

mysql - 完成嵌套 SQL 查询的更好方法?

sql - Postgres 将时间戳列约束从 NOT NULL 更改为 NULL

sql-server - 如何让 Entity Framework 1.0 在访问特定实体时使用 nolock 提示

sql - SSRS 日期时间选择器 : allow user to pick the time component

sql-server - 如何使在 Virtual PC 中运行的 SQL Server 可以访问主机操作系统?

database - Sitecore 外部数据库集成

sql - PostgreSQL 中的 Gist 索引仅适用于顺序,但不适用于谓词

sql - 当我期望多行时,Postgres 中的交叉表函数返回一行输出