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 |
我的数据格式如下,并尝试使用 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 |