SQL Server row_number() 按查询分区
Posted
技术标签:
【中文标题】SQL Server row_number() 按查询分区【英文标题】:SQL Server row_number() Partition by query 【发布时间】:2017-10-01 20:38:49 【问题描述】:我有以下格式的数据,并尝试使用 row_number() 和 accountCategoryount 获取唯一的 customerIDCount 和分区,但下面的查询有问题,有人可以帮忙吗?
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
【问题讨论】:
【参考方案1】:问题是ROW_NUMBER()
总是返回不同的数字,而您希望为“phoneNumber”和“ID”的相同值获取相同的数字,为此您需要使用返回相同值的DENSE_RANK()
关系:
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 |
【讨论】:
以上是关于SQL Server row_number() 按查询分区的主要内容,如果未能解决你的问题,请参考以下文章