【问题标题】:How do you assert that the current row in WINDOW is the last row?您如何断言 WINDOW 中的当前行是最后一行?
【发布时间】:2019-01-03 15:40:02
【问题描述】:

如果我有一个带有 ROW_NUMBER() OVER 的查询,我如何才能获得此窗口中总行数的输出,或者最后一行作为布尔值?

我想在结果中创建两列,并为窗口中的第一行和最后一行创建一个布尔值。

A | ROW_NUMBER
---
1 | 1
2 | 1
2 | 2
3 | 1


TO

A | ROW_NUMBER | FIRST | LAST
---
1 | 1 | 1 | 1
2 | 1 | 1 | 0
2 | 2 | 0 | 1
3 | 1 | 1 | 1

【问题讨论】:

    标签: sql hive amazon-athena presto


    【解决方案1】:

    你可以使用FIRST_VALUE:

    SELECT A, row_num, 
     CASE WHEN FIRST_VALUE(row_num) OVER(PARTITION BY A ORDER BY row_num) = row_num 
          THEN 1 ELSE 0 END AS first_row,
     CASE WHEN FIRST_VALUE(row_num) OVER(PARTITION BY A ORDER BY row_num DESC)=row_num 
          THEN 1 ELSE 0 END AS last_row  
    FROM tab
    ORDER BY a, row_num;
    

    db<>fiddle demo

    输出:

    +----+----------+------------+----------+
    | a  | row_num  | first_row  | last_row |
    +----+----------+------------+----------+
    | 1  |       1  |         1  |        1 |
    | 2  |       1  |         1  |        0 |
    | 2  |       2  |         0  |        1 |
    | 3  |       1  |         1  |        1 |
    +----+----------+------------+----------+
    

    【讨论】:

    • 太好了,谢谢。喜欢FIRST_VALUE的用法。
    【解决方案2】:

    这会给你总数:

    COUNT(*) OVER ...
    

    你也可以这样做:

    ROW_NUMBER() OVER (.... ORDER BY ... DESC)
    

    降序排列意味着 1 = 你的最后一条记录

    【讨论】:

      【解决方案3】:

      我愿意:

      select 
        a,
        row_number,
        case ra = 1 then 1 else 0 end as first,
        case rd = 1 then 1 else 0 end as last
      from (
        select
          a,
          row_number,
          row_number() over(partition by a order by row_number) as ra,
          row_number() over(partition by a order by row_number desc) as rd
        from my_table
      ) x
      order by a
      

      【讨论】:

      • 当你这样说的时候看起来很明显!干杯。
      猜你喜欢
      • 2011-05-25
      • 2019-05-10
      • 1970-01-01
      • 2013-05-08
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 2014-11-14
      相关资源
      最近更新 更多