我有一个查询,它从表中检索最新数据,并且分页工作正常。
但是,一旦数据从当前时间开始变老,它也应该出现在最新的数据之后。
SELECT A.UserId,A.FirstName,A.LastName,A.PostDate
(SELECT ROW_NUMBER() OVER(ORDER BY CAST(M.PostDate AS DATETIMEOFFSET) DESC) AS 'RowNumber'
M.UserId,
M.FirstName,
M.LastName,
M.PostDate
FROM Messages AS M
Where M.PostDate >= GetDate()
) A
WHERE A.RowNumber BETWEEN @RowStart AND @RowEnd
ORDER BY CAST(A.PostDate AS DATETIMEOFFSET) DESC
答案 0 :(得分:2)
我不确定我是否正好得到了你正在寻找的东西,但这应该能让你接近一些。我创建了一个包含两个计算列的CTE:
然后,我只是使用这两个字段进行排序:
DECLARE @current datetime = GETDATE()
;WITH cteMessages AS
(
SELECT UserId, FirstName, LastName, PostDate,
CASE WHEN PostDate < @current THEN 1 ELSE 0 END AS BeforeAfter,
ABS(DATEDIFF(SECOND, @current, PostDate)) AS AbsDiff
FROM Messages
)
SELECT * FROM cteMessages
ORDER BY BeforeAfter, AbsDiff
从这些结果中,您可以看到它们是如何通过比传入日期更新的消息排序,然后按旧消息的相反顺序排序。您可以将该顺序替换为Row_Number函数。
答案 1 :(得分:0)
我认为你应该删除以下行
Where M.PostDate >= GetDate()
答案 2 :(得分:0)
如果您在表的同一列上执行Order By ASC
和DESC
,则会出现以下错误
消息169,级别15,状态1,行1已指定更多列 按列表顺序不止一次。列表中的列必须是 唯一的。
如果你想要它,你可以使用相同的表的连接和相同的列,如
SELECT A.UserId,A.FirstName,A.LastName,A.PostDate
(SELECT ROW_NUMBER() OVER(ORDER BY CAST(M.PostDate AS DATETIMEOFFSET) DESC) AS 'RowNumber'
M.UserId,
M.FirstName,
M.LastName,
M.PostDate
FROM Messages AS M
Where M.PostDate >= GetDate()
) A
Inner Join Messages AS Msg on Msg.UserId=A.UserId
WHERE A.RowNumber BETWEEN @RowStart AND @RowEnd
ORDER BY CAST(A.PostDate AS DATETIMEOFFSET) DESC,
CAST(Msg.PostDate AS DATETIMEOFFSET) ASC