SQL 服务器 row_number() 按查询分区

SQL Server row_number() Partition by query

我的数据格式如下,并尝试使用 row_number() 和分区来获取唯一的 customerIDCount 和 accountCategoryount,但以下查询有问题,有人可以帮忙吗?

with cte as 
(
    select 
        *,
        accountCategoryCount = row_number() over (partition by phoneNUmber, ID, accountCategory Order by phoneNumber) 
    from 
        (select distinct * from myTable) base
),
cet2 as 
(
    select 
        *,
        customerIDCount = row_number() over (partition by phoneNumber, ID order by phoneNumber 
    from 
        cte A
)
select * from cte2

MyTable 数据:

phoneNumber ID   name  dob      accountCategory accountNumber balance
123456789   456  sam   10061970 checking        4567          10
123456789   456  sam   10061970 checking        4568          200
123456789   456  sam   10061970 Savings         4569          12
123456789   456  sam   10061970 Savings         4570          13
123456789   789  John  10101970 CreditCard      4571          400
123456789   789  John  10101970 CreditCard      4572          600
123456789   789  John  10101970 Savings         4573          50

预期结果

phoneNumber ID   name  dob      accountCategory accountNumber balance accountCategoryCount customerIDCount 
123456789   456  sam   10061970 checking        4567          10      1                    1
123456789   456  sam   10061970 checking        4568          200     2                    1
123456789   456  sam   10061970 Savings         4569          12      1                    1
123456789   456  sam   10061970 Savings         4570          13      2                    1
123456789   789  John  10101970 CreditCard      4571          400     1                    2
123456789   789  John  10101970 CreditCard      4572          600     2                    2
123456789   789  John  10101970 Savings         4573          50      1                    2

问题是 ROW_NUMBER() 总是 return 不同的数字,而您想为 "phoneNumber" 和 "ID" 的相同值获得相同的数字,为此您需要使用 DENSE_RANK(),其中 return 的值相同:

with cte as (
    select *,
        row_number() over (partition by phoneNumber, ID, accountCategory Order by phoneNumber) as accountCategoryCount,
        dense_rank() over (order by phoneNumber, ID) as customerIDCount
    from 
        (select distinct * from myTable) base
)
select * from cte

结果:

| phoneNumber |  ID | accountCategory | ... | accountCategoryCount | customerIDCount |
|-------------|-----|-----------------|-----|----------------------|-----------------|
|   123456789 | 456 |        checking |     |                    1 |               1 |
|   123456789 | 456 |        checking |     |                    2 |               1 |
|   123456789 | 456 |         Savings |     |                    1 |               1 |
|   123456789 | 456 |         Savings |     |                    2 |               1 |
|   123456789 | 789 |      CreditCard |     |                    1 |               2 |
|   123456789 | 789 |      CreditCard |     |                    2 |               2 |
|   123456789 | 789 |         Savings |     |                    1 |               2 |