在单个查询中按顺序排列Asc和Desc

时间:2015-02-26 12:01:27

标签: sql-server azure-sql-database

我有一个查询,它从表中检索最新数据,并且分页工作正常。

但是,一旦数据从当前时间开始变老,它也应该出现在最新的数据之后。

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

3 个答案:

答案 0 :(得分:2)

我不确定我是否正好得到了你正在寻找的东西,但这应该能让你接近一些。我创建了一个包含两个计算列的CTE:

  • BeforeAfter,确定日期是否在传递日期之前或之后发生
  • AbsDiff,它给出了日期差异的绝对值。

然后,我只是使用这两个字段进行排序:

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 ASCDESC,则会出现以下错误

  

消息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