SQL Row_Number() function in Where Clause

后端 未结 10 1509
野性不改
野性不改 2020-12-02 16:11

I found one question answered with the Row_Number() function in the where clause. When I tried one query, I was getting the following error:

10条回答
  •  抹茶落季
    2020-12-02 16:44

    based on OP's answer to question:

    Please see this link. Its having a different solution, which looks working for the person who asked the question. I'm trying to figure out a solution like this.

    Paginated query using sorting on different columns using ROW_NUMBER() OVER () in SQL Server 2005

    ~Joseph

    "method 1" is like the OP's query from the linked question, and "method 2" is like the query from the selected answer. You had to look at the code linked in this answer to see what was really going on, since the code in the selected answer was modified to make it work. Try this:

    DECLARE @YourTable table (RowID int not null primary key identity, Value1 int, Value2 int, value3 int)
    SET NOCOUNT ON
    INSERT INTO @YourTable VALUES (1,1,1)
    INSERT INTO @YourTable VALUES (1,1,2)
    INSERT INTO @YourTable VALUES (1,1,3)
    INSERT INTO @YourTable VALUES (1,2,1)
    INSERT INTO @YourTable VALUES (1,2,2)
    INSERT INTO @YourTable VALUES (1,2,3)
    INSERT INTO @YourTable VALUES (1,3,1)
    INSERT INTO @YourTable VALUES (1,3,2)
    INSERT INTO @YourTable VALUES (1,3,3)
    INSERT INTO @YourTable VALUES (2,1,1)
    INSERT INTO @YourTable VALUES (2,1,2)
    INSERT INTO @YourTable VALUES (2,1,3)
    INSERT INTO @YourTable VALUES (2,2,1)
    INSERT INTO @YourTable VALUES (2,2,2)
    INSERT INTO @YourTable VALUES (2,2,3)
    INSERT INTO @YourTable VALUES (2,3,1)
    INSERT INTO @YourTable VALUES (2,3,2)
    INSERT INTO @YourTable VALUES (2,3,3)
    INSERT INTO @YourTable VALUES (3,1,1)
    INSERT INTO @YourTable VALUES (3,1,2)
    INSERT INTO @YourTable VALUES (3,1,3)
    INSERT INTO @YourTable VALUES (3,2,1)
    INSERT INTO @YourTable VALUES (3,2,2)
    INSERT INTO @YourTable VALUES (3,2,3)
    INSERT INTO @YourTable VALUES (3,3,1)
    INSERT INTO @YourTable VALUES (3,3,2)
    INSERT INTO @YourTable VALUES (3,3,3)
    SET NOCOUNT OFF
    
    DECLARE @PageNumber     int
    DECLARE @PageSize       int
    DECLARE @SortBy         int
    
    SET @PageNumber=3
    SET @PageSize=5
    SET @SortBy=1
    
    
    --SELECT * FROM @YourTable
    
    --Method 1
    ;WITH PaginatedYourTable AS (
    SELECT
        RowID,Value1,Value2,Value3
            ,CASE @SortBy
                 WHEN  1 THEN ROW_NUMBER() OVER (ORDER BY Value1 ASC)
                 WHEN  2 THEN ROW_NUMBER() OVER (ORDER BY Value2 ASC)
                 WHEN  3 THEN ROW_NUMBER() OVER (ORDER BY Value3 ASC)
                 WHEN -1 THEN ROW_NUMBER() OVER (ORDER BY Value1 DESC)
                 WHEN -2 THEN ROW_NUMBER() OVER (ORDER BY Value2 DESC)
                 WHEN -3 THEN ROW_NUMBER() OVER (ORDER BY Value3 DESC)
             END AS RowNumber
        FROM @YourTable
        --WHERE
    )
    SELECT
        RowID,Value1,Value2,Value3,RowNumber
            ,@PageNumber AS PageNumber, @PageSize AS PageSize, @SortBy AS SortBy
        FROM PaginatedYourTable
        WHERE RowNumber>=(@PageNumber-1)*@PageSize AND RowNumber<=(@PageNumber*@PageSize)-1
        ORDER BY RowNumber
    
    
    
    --------------------------------------------
    --Method 2
    ;WITH PaginatedYourTable AS (
    SELECT
        RowID,Value1,Value2,Value3
            ,ROW_NUMBER() OVER
             (
                 ORDER BY
                     CASE @SortBy
                         WHEN  1 THEN Value1
                         WHEN  2 THEN Value2
                         WHEN  3 THEN Value3
                     END ASC
                    ,CASE @SortBy
                         WHEN -1 THEN Value1
                         WHEN -2 THEN Value2
                         WHEN -3 THEN Value3
                     END DESC
             ) RowNumber
        FROM @YourTable
        --WHERE  more conditions here
    )
    SELECT
        RowID,Value1,Value2,Value3,RowNumber
            ,@PageNumber AS PageNumber, @PageSize AS PageSize, @SortBy AS SortBy
        FROM PaginatedYourTable
        WHERE 
            RowNumber>=(@PageNumber-1)*@PageSize AND RowNumber<=(@PageNumber*@PageSize)-1
            --AND more conditions here
        ORDER BY
            CASE @SortBy
                WHEN  1 THEN Value1
                WHEN  2 THEN Value2
                WHEN  3 THEN Value3
            END ASC
           ,CASE @SortBy
                WHEN -1 THEN Value1
                WHEN -2 THEN Value2
                WHEN -3 THEN Value3
            END DESC
    

    OUTPUT:

    RowID  Value1 Value2 Value3 RowNumber  PageNumber  PageSize    SortBy
    ------ ------ ------ ------ ---------- ----------- ----------- -----------
    10     2      1      1      10         3           5           1
    11     2      1      2      11         3           5           1
    12     2      1      3      12         3           5           1
    13     2      2      1      13         3           5           1
    14     2      2      2      14         3           5           1
    
    (5 row(s) affected
    
    RowID  Value1 Value2 Value3 RowNumber  PageNumber  PageSize    SortBy
    ------ ------ ------ ------ ---------- ----------- ----------- -----------
    10     2      1      1      10         3           5           1
    11     2      1      2      11         3           5           1
    12     2      1      3      12         3           5           1
    13     2      2      1      13         3           5           1
    14     2      2      2      14         3           5           1
    
    (5 row(s) affected)
    

提交回复
热议问题