![](/img/trans.png)
[英]SQL query using ROW_NUMBER() OVER PARTITION BY with Dynamic Columns
[英]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.