Как вы утверждаете, что текущая строка в ОКНЕ является последней строкой? - PullRequest
0 голосов
/ 03 января 2019

Если у меня есть запрос с 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

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Вы можете использовать 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;

ДБ <> 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 |
+----+----------+------------+----------+
0 голосов
/ 03 января 2019

Я бы сделал:

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
0 голосов
/ 03 января 2019

Это дает вам общее количество:

COUNT(*) OVER ...

Вы также можете сделать:

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

Порядок в порядке убывания означает 1 = ваша последняя запись

...