我想为 CardId 和 InvoiceNo 的每个组合提供以下数据的编号/等级
;WITH Test (CardId,InvoiceNo,Category,Amount) as
(
SELECT '1001','3001','Fees',30
UNION ALL SELECT '1001','3001','Non-Fees',45
UNION ALL SELECT '1001','3001','Service Fees',55
UNION ALL SELECT '1002','3002','Fees',10
UNION ALL SELECT '1002','3002','Non-Fees',25
UNION ALL SELECT '1002','3002','Service Fees',10
UNION ALL SELECT '1003','3010','Fees',45
UNION ALL SELECT '1003','3010','Non-Fees',70
)
像这样
CardId InvoiceNo Amount Rank
1001 3001 30 1
1001 3001 45 1
1001 3001 55 1
1002 3002 10 2
1002 3002 25 2
1002 3002 10 2
1003 3010 45 3
1003 3010 70 3
我用
Row_number()
和 Rank()
尝试了下面的查询,但没有给我想要的结果。 rank()
将所有行排名为 1,row_number()
将每个组编号为 1,2,3。SELECT CardId
,InvoiceNo
,Amount
,RANK() OVER (PARTITION BY CardID,InvoiceNo ORDER BY CardId) as RankNo
FROM Test
最佳答案
删除分区。 rank 函数在新分区重置排名的分区内查找。因此,它将每个分区中的每条记录都视为并列第一。此外,您可能需要 dense_rank()
。
SELECT CardId
,InvoiceNo
,Amount
,DENSE_RANK() OVER (ORDER BY CardId, InvoiceNo) as RankNo
FROM Test
ORDER BY CardId, InvoiceNo, Amount
fiddle :
关于sql - 如何在 T-SQL 中对分区进行排名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48756159/