Vertica / SQL: получение строк сразу после событий - PullRequest
0 голосов
/ 09 мая 2018

Рассмотрим простой запрос

select from tbl where status=MELTDOWN

Я хотел бы сейчас создать таблицу, которая помимо этих строк также включает в себя предыдущие p строк и последующие n строк, чтобы я мог понять, что происходит во время этих MELTDOWN. Есть намеки?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете сделать это с помощью оконных функций, получив последовательность строк расплавления. Я предпочитаю делать это с lag()/lead() ignore nulls, но Vertical не поддерживает это. Я думаю, что это эквивалентно first_value()/last_value():

with t as (
      select t.*, row_number() over (order by id) as seqnum
      from tbl
     ),
     tt as (
      select t.*,
             last_value(case when status = 'meltdown' then seqnum end ignore nulls) over (order by seqnum rows between unbounded preceding and current row) as prev_meltdown_seqnum,
             first_value(case when status = 'meltdown' then seqnum end ignore nulls) over (order by seqnum rows between current row and unbounded following) as prev_meltdown_seqnum,
      from t
     )
select tt.*
from tt
where seqnum between prev_melt_seqnum and prev_melt_seqnum + 7 or
      seqnum between next_melt_seqnum -5 and next_melt_seqnum;
0 голосов
/ 09 мая 2018
WITH
  grouped AS
(
  SELECT
    SUM(
      CASE WHEN status = 'Meltdown' THEN 1 ELSE 0 END
    )
    OVER (
      ORDER BY timeStamp
    )
      AS GroupID,
    tbl.*
  FROM
    tbl
),
  sorted AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY timeStamp ASC )   AS incPos,
    ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY timeStamp DESC)   AS decPos,
    MAX(GroupID) OVER ()                                               AS LastGroup
    grouped.*
  FROM
    grouped
)
SELECT
  sorted.*
FROM
  sorted
WHERE
     (incPos <= 8 AND GroupID  > 0        )   -- Meltdown and the 7 events following it
  OR (decPos <= 6 AND GroupID <> LastGroup)   --          and the 6 events preceding a Meltdown
ORDER BY
  timeStamp
...