我正在尝试选择一组与特定日期最接近(包括之前和之后)的日期。
我非常接近,我现在要做的就是选择排名前10的“亲密度”为0 ......但我不知道该怎么做。
BEGIN
Declare @DateCenter datetime2 = '2011-03-30 00:15:00'
Declare @DateStart datetime2 = DATEADD(day,-7,@DateCenter)
Declare @DateEnd datetime2 = DATEADD(day,7,@DateCenter)
SELECT TOP 30 *, DateDiff(hour, Utc, @DateCenter) as Closeness
FROM [CheckIns]
WHERE Utc BETWEEN @DateStart AND @DateEnd
END
答案 0 :(得分:2)
10或30,你的叙述和代码示例不匹配。无论如何,以下应该有效:
select top 10 *
from (
select *,ROW_NUMBER() OVER (ORDER BY ABS(DATEDIFF(minute,Utc,@DateCenter))) as rn
from CheckIns
) t
order by rn
这不区分之前和之后的那些 - 它只是寻找最接近的10个。如果您想要,例如,日期之前的10和成功的10,那么您需要2个排序,或者PARTITION BY
子句也可能需要ROW_NUMBER
窗口函数。
如果您想要包含关联结果,则需要切换为使用RANK()
或DENSE_RANK()
而不是ROW_NUMBER()
。
答案 1 :(得分:0)
我认为这将使用Utc
上的(如果有的话)索引:
SELECT TOP 10
*
FROM
( SELECT TOP 10
*
, DateDiff(hour, Utc, @DateCenter) as Closeness
FROM [CheckIns]
WHERE Utc >= @DateCenter
ORDER BY Utc
UNION ALL
SELECT TOP 10
*
, DateDiff(hour, @DateCenter, Utc) as Closeness
FROM [CheckIns]
WHERE Utc < @DateCenter
ORDER BY Utc DESC
) AS temp
ORDER BY Closeness