【问题标题】:Increment Row_Number Only Where Distinct仅在不同的地方增加 Row_Number
【发布时间】:2017-11-14 14:22:15
【问题描述】:

我有下表,我将其制作得很简单,因为我不知道如何将其格式化为此处的表格(旁注,如果有人可以将我链接到一个简单的教程,我将永远感激不尽) .

id
1
1
1
2
2
2

我想添加另一列,仅在不同的 ID 上增加数量,因此结果应该是

Id
1
1
1
2
2
2

rowNum 
1
1
1
2
2
2

目前我能得到的只有:

id
1
1
1
2
2
2
rowNum
1
2
3
4
5
6

我在这里遗漏了一些非常简单的东西,因为我相信我应该能够使用 row_number 或 rank 以及一个窗口函数来解决这个问题,但我无法弄清楚。

【问题讨论】:

    标签: tsql


    【解决方案1】:

    您也可以使用子查询自联接来做到这一点。

    mysql> select id, 
    > (select count(distinct id) 
    >  from 
    >  testtest b 
    >  where b.id < a.id) 
    > from testtest a;
    +------+---------------------------------------------------------------+
    | id   | (select count(distinct id) from testtest b where b.id < a.id) |
    +------+---------------------------------------------------------------+
    |    1 |                                                             0 |
    |    1 |                                                             0 |
    |    1 |                                                             0 |
    |    2 |                                                             1 |
    |    2 |                                                             1 |
    |    2 |                                                             1 |
    +------+---------------------------------------------------------------+
    6 rows in set (0.01 sec)
    

    还有一种方法:

    select a.id, b.idRank
    from testtest a,
       (
       select id, 
       rank() over 
          (order by id) as idRank
       from (
             select distinct id 
             from testtest
            ) testtest2
       ) b
    where a.id = b.id
    

    【讨论】:

    • 您的第一个查询是窗口函数的不错替代方案,在它们可能不可用的情况下(例如 MySQL)+1
    【解决方案2】:

    使用DENSE_RANK() 代替ROW_NUMBER()

    SELECT
        id,
        DENSE_RANK() OVER (ORDER BY id) dr
    FROM yourTable
    

    Demo

    【讨论】:

    • 就是这样!在这种情况下,这不会被视为窗口函数,对吗?只是想知道,所以我将来会直接了解我的术语。
    • DENSE_RANK() 实际上是一个窗口函数。每当您看到OVER 时,您都应该阅读“窗口功能”。查看here 以比较行数与密集排名。
    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 2019-03-29
    • 2013-08-09
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多