我想为 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/

10-11 21:56
查看更多