SQL-OVER和ORDERBY
我不太明白,我想澄清这是什么,我认为它是什么 如果我提供了排序类型、记录状态和会议日期: 我想按默认会议日期排序。 当排序类型为2时,我想按状态排序,然后按会议日期排序 下面的代码可以做到这一点吗?我的测试表明确实如此,但我可能遗漏了什么SQL-OVER和ORDERBY,sql,sql-server,window-functions,Sql,Sql Server,Window Functions,我不太明白,我想澄清这是什么,我认为它是什么 如果我提供了排序类型、记录状态和会议日期: 我想按默认会议日期排序。 当排序类型为2时,我想按状态排序,然后按会议日期排序 下面的代码可以做到这一点吗?我的测试表明确实如此,但我可能遗漏了什么 SELECT Foo.*, ROW_NUMBER() OVER ( ORDER BY CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC,
SELECT Foo.*,
ROW_NUMBER() OVER (
ORDER BY
CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC,
Foo.MeetingDate DESC
) AS RowOrder
更具体地说,如果@SortType为1,那么认为代码分解为:
SELECT Foo.*,
ROW_NUMBER() OVER (
ORDER BY
ASC,
Foo.MeetingDate DESC
) AS RowOrder
我认为这可以分解为:
SELECT Foo.*,
ROW_NUMBER() OVER (
ORDER BY
Foo.MeetingDate DESC
) AS RowOrder
与(当@SortType为2时)相反:
CASE@SortType WHEN 2 THEN Foo.FK_Status END
相当于CASE@SortType WHEN 2 THEN Foo.FK_Status ELSE NULL END
。换句话说,如果@SortType=1,则有效的查询如下:
SELECT Foo.*,
ROW_NUMBER() OVER (
ORDER BY
NULL ASC,
Foo.MeetingDate DESC
) AS RowOrder
RowOrder
列将按所述顺序排列,但如果查询末尾没有orderby
子句,则无法保证行的排序顺序
因此:
-可以以任何顺序出现,同时:
SELECT Foo.*
FROM Foo
ORDER BY CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC, Foo.MeetingDate DESC;
-将按所述排序顺序对输出排序(不包括RowOrder列)
SELECT Foo.*,
ROW_NUMBER() OVER (ORDER BY
CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC,
Foo.MeetingDate DESC) AS RowOrder
FROM Foo;
SELECT Foo.*
FROM Foo
ORDER BY CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC, Foo.MeetingDate DESC;