Sql 如何断言窗口中的当前行是最后一行?
如果我有一个在上有一个Sql 如何断言窗口中的当前行是最后一行?,sql,hive,amazon-athena,presto,Sql,Hive,Amazon Athena,Presto,如果我有一个在上有一个ROW_NUMBER()的查询,我如何才能得到这个窗口中所有行的输出,或者最后一行作为布尔值 我想在结果中为窗口中的第一行和最后一行创建两列,并使用布尔值 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 这将为您提供总计数: COUNT(*) O
ROW_NUMBER()的查询,我如何才能得到这个窗口中所有行的输出,或者最后一行作为布尔值
我想在结果中为窗口中的第一行和最后一行创建两列,并使用布尔值
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
这将为您提供总计数:
COUNT(*) OVER ...
您还可以执行以下操作:
ROW_NUMBER() OVER (.... ORDER BY ... DESC)
按降序排序意味着1=您的最后一条记录这将给出总计数:
COUNT(*) OVER ...
您还可以执行以下操作:
ROW_NUMBER() OVER (.... ORDER BY ... DESC)
按降序排序意味着1=您的最后一条记录您可以使用第一个值
:
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;
输出:
+----+----------+------------+----------+
| a | row_num | first_row | last_row |
+----+----------+------------+----------+
| 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 0 |
| 2 | 2 | 0 | 1 |
| 3 | 1 | 1 | 1 |
+----+----------+------------+----------+
您可以使用第一个\u值
:
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;
输出:
+----+----------+------------+----------+
| a | row_num | first_row | last_row |
+----+----------+------------+----------+
| 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 0 |
| 2 | 2 | 0 | 1 |
| 3 | 1 | 1 | 1 |
+----+----------+------------+----------+
我会:
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
我会:
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
当你这样说的时候,似乎很明显!干杯。当你这样说的时候,似乎很明显!干杯,太好了,谢谢。喜欢使用FIRST\u VALUE
。非常好,谢谢。就像使用第一个\u值一样。