SQL - выбирайте окружающие записи одной выполняющей условие - PullRequest
0 голосов
/ 08 марта 2019

У меня есть следующая таблица:

epochTime,id,counter1,value
123,Alpha,2,2
124,Beta,0,3
135,Alpha,0,1
112,Alpha,0,5
150,Alpha,0,-1
225,Beta,1,2
228,Beta,1,0
300,Beta,0,2

Я хочу выбрать все записи с counter1> 0 и записи после этого, разделив их по id и упорядочив по epochTime (требование аналогично команде Unix «grep -A 1») Таким образом, ожидаемый результат от данных выше будет

epochTime      id    counter1       value
      123   Alpha           2           2
      135   Alpha           0           1
      225    Beta           1           2
      228    Beta           1           0
      300    Beta           0           2

Я использую AWS Athena и получил следующий запрос, который работает, как и ожидалось.

SELECT * FROM (
    SELECT id,
        epochTime,
        counter1,
        value,
        first_value(counter1) OVER (
            PARTITION BY id
            ORDER BY epochTime
            ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
        ) AS preCounter
    FROM testsql
) WHERE counter1 > 0 OR preCounter > 0   

Однако я вижу две проблемы с запросом:

  • Это вложенный запрос
  • Мне нужно было создать фиктивный столбец (preCounter). Если требования к условию WHERE станут более сложными (например, условия для нескольких столбцов), мне потребуется создать несколько фиктивных столбцов

    1. Есть ли для меня лучшие решения (лучшая производительность, более простой запрос, ...) для меня?
    2. Что если counter1 - это число следующих записей, которые мне нужно выбрать?

1 Ответ

1 голос
/ 08 марта 2019

Вы можете использовать lag():

select t.*
from (select t.*,
             lag(counter) over (partition by id order by epochtime) as prev_counter
      from testseql t
     ) t
where counter > 0 or prev_counter > 0;
...