У меня есть следующая таблица:
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 станут более сложными (например, условия для нескольких столбцов), мне потребуется создать несколько фиктивных столбцов
- Есть ли для меня лучшие решения (лучшая производительность, более простой запрос, ...) для меня?
- Что если counter1 - это число следующих записей, которые мне нужно выбрать?