【问题标题】:understand query to generate row number了解查询以生成行号
【发布时间】:2020-12-18 01:52:51
【问题描述】:

我很难理解以下查询如何按顺序生成行号。

select id, value, (select count(*) from tbl b  where a.id >= b.id) as cnt
from tbl a

我的目标本质上是生成列 cnt,但我无法理解 count 函数是什么以及 where 子句在做什么。

表格tbl

id value cnt
1  yes   1
3  yes   2
4  yes   3
6  yes   4
9  yes   5

也欢迎任何线索。谢谢! 链接代码here

【问题讨论】:

    标签: sql sqlite count


    【解决方案1】:

    对于该表的每一行,此查询:

    select count(*) from tbl b  where a.id >= b.id
    

    计算小于或等于当前idids的数量。
    所以对于id = 1,只有1个id小于或等于1,所以结果是1
    对于id = 3,有2个ids小于或等于3ids13,所以结果是2

    请注意,如果这不是家庭作业,那么您可以使用 COUNT(*) 窗口函数获得相同的结果:

    select id, value, count(*) over (order by id) as cnt
    from tbl 
    

    请参阅demo

    【讨论】:

      【解决方案2】:

      这是一个标量相关子查询,逻辑上它是为每一行执行的。

      对于id 1,只有一行select * where id <= 1 = 1

      对于id 3 --> select * where id <= 3 = 1,3

      对于id 4 --> select * where id <= 4 = 1,3,4

      对于id 6 --> select * where id <= 6 = 1,3,4,6

      对于id 9 --> select * where id <= 9 = 1,3,4,6,9

      【讨论】:

        【解决方案3】:

        如果你想要行号,使用row_number():

        select id, value, row_number() over (order by id desc) as cnt
        from tbl t;
        

        【讨论】:

          猜你喜欢
          • 2012-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-17
          • 2012-06-21
          相关资源
          最近更新 更多