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() 按查询分区的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 批量删除重复记录

sql server row_number

sql server 按字母顺序排序,然后是数字

SQL Server 2005 ROW_NUMBER() 没有 ORDER BY

SQL Server中row_number函数用法介绍

ROW_NUMBER SQL Server 2005的LIMIT功能实现(ROW_NUMBER()排序函数)