SQL-选择一个符合条件的周围记录



我有下表:

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   

但是,我看到查询的两个问题:

  • 这是一个嵌套查询
  • 我需要创建一个虚拟列(预先出现)。如果在某些情况下的要求变得更加复杂(即:多列的条件),我需要创建多个虚拟列

    1. 我有更好的解决方案(更好的性能,更简单的查询,...)吗?
    2. 如果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;

相关内容

  • 没有找到相关文章

最新更新