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