[英]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.