выбор текущего и предыдущего значения из последовательных строк - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть набор результатов, из которого мне нужно извлечь вывод. Набор результатов выглядит следующим образом:

+----------+-------------+----------------+-----------+
| Issue_id | create_date | transtimestamp | Npriority |
+----------+-------------+----------------+-----------+
| 556365   | 2020-02-02  | 1580628330     | 2         |
| 556365   | 2020-02-02  | 1580629317     | 0         |
| 773656   | 2020-02-02  | 1580608104     | 1         |
| 773656   | 2020-02-02  | 1580609625     | 0         |
| 111252   | 2020-02-02  | 1580622323     | 1         |
| 111252   | 2020-02-02  | 1580623399     | 2         |
+----------+-------------+----------------+-----------+

Я хотел бы сгенерировать вывод из вышеприведенного:

+----------+-------------+------------+-----------+
| Issue_id | create_date | prev_value | cur_value |
+----------+-------------+------------+-----------+
| 556365   | 2020-02-02  | 2          | 0         |
| 773656   | 2020-02-02  | 1          | 0         |
| 111252   | 2020-02-02  | 1          | 2         |
+----------+-------------+------------+-----------+

Я использую что-то следующее, но не могу получить желаемый набор результатов :

select  Issue_id,Npriority,lag(Npriority)   over (partition by Issue_id order by trantimestamp) as prev_value FROM (select * from results)

Ответы [ 3 ]

2 голосов
/ 12 февраля 2020

BigQuery может сделать это с агрегацией:

select Issue_id, create_date,
       array_agg(Npriority order by transtimestamp desc limit 1)[ordinal(1)] as latest_value,
       array_agg(Npriority order by transtimestamp desc limit 2)[ordinal(2)] as prev_value
from results r
group by Issue_id create_date;
1 голос
/ 12 февраля 2020

Вы были на правильном пути.

with data as (
  select 
  *
  , lag(Npriority,1) over (partition by Issue_id order by transtimestamp asc) as prev_Npriority -- Get previous
  , row_number() over (partition by Issue_id order by transtimestamp desc) as rn -- order by most recent
 from `project.dataset.table`
)
select Issue_id, create_date, prev_Npriority as prev_value, Npriority as cur_value
from data 
where rn = 1 -- filter to most recent
1 голос
/ 12 февраля 2020

Вы можете сделать простое самостоятельное соединение

select a.Issue_id, a.create_date, b.cur_value as prev_value, a.cur_value
from results a inner join results b on a.Issue_id = b.Issue_id 
and a.transtimestamp   > b.transtimestamp  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...