【问题标题】: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 |
+----+----------+------------+----------+
【解决方案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