我有下表:
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
但是,我看到查询的两个问题:
- 这是一个嵌套查询
我需要创建一个虚拟列(预先出现)。如果在某些情况下的要求变得更加复杂(即:多列的条件),我需要创建多个虚拟列
- 我有更好的解决方案(更好的性能,更简单的查询,...)吗?
- 如果Counter1是我需要选择以下记录的数量?
您可以使用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;