簡體   English   中英

SQL 服務器:枚舉使用 ROW_NUMBER() OVER (PARTITION

[英]SQL Server: Enumerating table query groups created with ROW_NUMBER() OVER (PARTITION

我有一個類似下一個查詢:

DECLARE @RETURN_TABLE TABLE(
        MARKET varchar(200),
        NAMES varchar(200),
        PK_IDS VARCHAR (25),
        PFK_MARKET INT,
        IS_ADHOC BIT,
        FK_APPLICATION INT)

...

SELECT *
FROM (
    SELECT *, 
    ROW_NUMBER() OVER (PARTITION BY PK_IDS, MARKET ORDER BY is_adhoc desc) seqnum
    FROM @RETURN_TABLE 
) t
WHERE seqnum = 1 AND MARKET LIKE '%' + @MARKET + '%' 
ORDER BY MARKET

其中 - 作為示例 - 返回類似這樣的內容(有更多行):

MARKET                      NAMES                       PK_IDS      PFK_MARKET  IS_ADHOC    FK_APP  seqnum
AB/West Region              AB - Value Add ...          1/2/39      226         1           0       1
AB/West Region              AB - Other Retail ...       1/3/39      226         1           0       1
AB/West Region - Breakthru  Browns Social ...           1/122/39    281         0           0       1
AB/West Region - Breakthru  Local STREET ...            1/123/39    281         0           0       1
AB/West Region - Breakthru  Moxie's STREET ...          1/124/39    281         0           0       1
adm Promotions              Branding Your POS ...       107/107/39  231         1           NULL    1
adm Promotions              Imagen Publicitaria ...     111/111/39  231         1           NULL    1
adm Promotions              ADM Promotions UK Limited   75/75/39    231         1           NULL    1

而且我需要枚舉分區記錄(市場組),所以我的結果將如下所示:

MARKET                      NAMES                       PK_IDS      PFK_MARKET  IS_ADHOC    FK_APP  seqnum  seqnum1
AB/West Region              AB - Value Add ...          1/2/39      226         1           0       1       1
AB/West Region              AB - Other Retail ...       1/3/39      226         1           0       1       1
AB/West Region - Breakthru  Browns Social ...           1/122/39    281         0           0       1       2
AB/West Region - Breakthru  Local STREET ...            1/123/39    281         0           0       1       2
AB/West Region - Breakthru  Moxie's STREET ...          1/124/39    281         0           0       1       2
adm Promotions              Branding Your POS ...       107/107/39  231         1           NULL    1       3
adm Promotions              Imagen Publicitaria ...     111/111/39  231         1           NULL    1       3
adm Promotions              ADM Promotions UK Limited   75/75/39    231         1           NULL    1       3

如您所見,我正在按 MARKET 分組並且需要枚舉組(然后我將使用此枚舉來分頁並顯示起始頁和分隔符之間的 N 個組)。

我取得了一些有效的東西,但我確信它可以以更好的方式完成:

DECLARE @lastindex int

SET @lastindex = (SELECT TOP 1 seqnum1 
        FROM (
            SELECT *, 
            ROW_NUMBER() OVER (PARTITION BY PK_IDS, MARKET ORDER BY is_adhoc desc) seqnum,
            DENSE_RANK() OVER (ORDER BY MARKET desc) seqnum1 
            FROM @RETURN_TABLE 
        ) t
        WHERE seqnum = 1 AND MARKET LIKE '%' + @MARKET + '%' ORDER BY seqnum1 desc)

--

SELECT *
    FROM (
        SELECT *, 
        ROW_NUMBER() OVER (PARTITION BY PK_IDS, MARKET ORDER BY is_adhoc desc) seqnum,
        DENSE_RANK() OVER (ORDER BY MARKET desc) seqnum1 
        FROM @RETURN_TABLE 
    ) t
    WHERE seqnum = 1 AND MARKET LIKE '%' + @MARKET + '%'
    AND @lastindex BETWEEN @lastindex-((@LIMIT*@PAGE)-1) AND (@lastindex-((@LIMIT*@PAGE)-1))+(@LIMIT-1)
    ORDER BY seqnum1 desc

我選擇最后一個索引(第一個 select 和 TOP 1),因為 DENSE_RANK() 以相反的順序返回組計數器。

我確信這可以只用一個查詢來完成,但不確定如何。

有什么幫助嗎?

好的,目前我會回答我自己的問題,以防它幫助其他人。

我的最后一個查詢是枚舉 MARKET 組的位置:

SELECT *
    FROM (
        SELECT *, 
        ROW_NUMBER() OVER (PARTITION BY PK_IDS, MARKET ORDER BY is_adhoc desc) seqnum,
        DENSE_RANK() OVER (ORDER BY MARKET) seqnum1 
        FROM @RETURN_TABLE 
    ) t
    WHERE seqnum = 1 AND MARKET LIKE '%' + @MARKET + '%'
    AND seqnum1 BETWEEN (@LIMIT*(@PAGE-1))+1 AND (@LIMIT*(@PAGE-1)) + @LIMIT
    ORDER BY seqnum1

在我的帖子中,由於內部“ORDER BY MARKET DESC”中的“desc”,我沒有意識到以相反順序顯示的行,刪除該 desc,DENSE_RANK() 顯示 seqnum1(我的組計數器列的名稱)以正確的順序,然后我可以避免第一個 select 得到最后一個索引,所以我最終得到一個 select 枚舉市場組,因此,我將能夠按市場組分頁。

我不能說這是最好的方法,但它確實有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM