簡體   English   中英

sql-group-如何在SQL查詢中給組中的子組不同的行ID?

[英]how to give different row id to sub group in in a group in sql query?

我為我的商品表有很多折扣方案,而對於每件商品,我都有不同的折扣方案。 現在我想為該項目提供行ID,但對於每個項目組,它應該從zer0(0)開始,並且當它獲得不同的DiscountId時,應該進行更改,我的表格在下面的圖像中。 在此處輸入圖片說明

現在以一個示例為例,對於ItemCode 429,DiscountId 427有7個相同的折扣,因此,我想要的所有行ID為0(零),但是當更改DiscountId時,這意味着對於Same ItemCode和428 DiscountId,則我想要另一個具有增量的RowId。 當ItemCode更改時,rowId應該從零(0)開始。

誰能幫我嗎?

我當前的查詢是simpaly“ select * from ItemDiscount_md”。

也許是這樣的:

測試數據:

DECLARE @tbl TABLE(ITEMCode INT,DiscountId INT)
INSERT INTO @tbl
VALUES
(73,419),(73,419),(73,420),(73,420),(73,420),
(429,427),(429,427),(429,427),(429,427),(429,427),
(429,427),(429,427),(429,427),(429,428),(429,428)

查詢:

;WITH CTE
AS
(
    SELECT
        DENSE_RANK() OVER(PARTITION BY tbl.ITEMCode 
                          ORDER BY DiscountId) AS Rownbr,
        tbl.*
    FROM
        @tbl AS tbl
)
SELECT
    CTE.Rownbr-1 AS RowNbr,
    CTE.DiscountId,
    CTE.ITEMCode
FROM
    CTE

當然,您可以通過編寫以下代碼來簡化查詢:

SELECT
    (DENSE_RANK() OVER(PARTITION BY tbl.ITEMCode 
                       ORDER BY DiscountId))-1 AS Rownbr,
    tbl.*
FROM
    @tbl AS tbl

我只是覺得CTE功能更好,更易讀

參考文獻:

編輯

回答評論。 沒有ROW_NUMBER將不會返回相同的計數器。 這是DENSE_RANK的輸出:

0   419 73
0   419 73
1   420 73
1   420 73
1   420 73
0   427 429
0   427 429
0   427 429
0   427 429
0   427 429
0   427 429
0   427 429
0   427 429
1   428 429
1   428 429

這是ROW_NUMBER

0   419 73
1   419 73
2   420 73
3   420 73
4   420 73
0   427 429
1   427 429
2   427 429
3   427 429
4   427 429
5   427 429
6   427 429
7   427 429
8   428 429
9   428 429

如您所見,當DENSE_RANK對組進行排名時, ROW_NUMBER ()重新計算了組

只是簡化了Arion的答案

 DECLARE @tbl TABLE(ITEMCode INT,DiscountId INT)
INSERT INTO @tbl
VALUES
(73,419),
(73,419),
(73,420),
(73,420),
(73,420),
(429,427),
(429,427),
(429,427),
(429,427),
(429,427),
(429,427),
(429,427),
(429,427),
(429,428),
(429,428)

;
SELECT
    (DENSE_RANK() OVER(PARTITION BY ITEMCode ORDER BY DiscountId) -1) AS Rownbr,
    DiscountId,
    ITEMCode
FROM
    @tbl

如果您得到這樣的數據:(來自圖像)@temp表

itemcode    DiscountId  DayId
----------- ----------- -----------
102         416         2
102         416         3
102         416         4
79          419         3
79          419         1
79          420         2
79          420         1

使用row_number()獲得以下結果

itemcode    DiscountId  DayId       rowid
----------- ----------- ----------- --------------------
102         416         2           1
102         416         3           2
102         416         4           3
79          419         3           1
79          419         1           2
79          420         2           1
79          420         1           2

SQL范例:

select itemcode, DiscountId, DayId
, ROW_NUMBER() over (partition by Discountid order by discountid) as 'rowid'
from @temp

暫無
暫無

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

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