SQL - OVER和ORDERBY

时间:2013-05-31 17:02:45

标签: sql sql-server window-functions

我不太了解,我想澄清一下我认为它做了什么。

如果我有提供的排序类型,记录状态和会议日期:

我想默认按MeetingDate排序。 我想按排序类型为2,然后按会议日期按状态排序。

以下代码是否这样做?我的测试表明它确实如此,但我可能会遗漏一些东西。

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时)相反:

  SELECT Foo.*,
    ROW_NUMBER() OVER (
        ORDER BY 
            Foo.FK_Status ASC,
            Foo.MeetingDate DESC
    ) AS RowOrder

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

RowOrder列将位于描述的序列中,但在查询结尾没有order by子句,则无法保证行的顺序被分类。

所以:

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;

- 将按照描述的排序顺序对输出进行排序(不包括RowOrder列)。