【问题标题】:SQL - select surrounding records of the one fulfil a conditionSQL - 选择一个满足条件的周围记录
【发布时间】:2019-07-30 02:54:11
【问题描述】:

我有下表:

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 是我需要选择的以下记录数怎么办?

【问题讨论】:

    标签: sql window-functions amazon-athena presto


    【解决方案1】:

    你可以使用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;
    

    【讨论】:

    • 感谢 Gordon Lag,在这个具体示例中,通过避免“行与行之间”的查询,可以降低查询的复杂性。但是假设我需要选择 2 个后续记录(而不是我的示例中的 1 个),滞后将不起作用。当我的 WHERE 条件在多个列上时,滞后也无济于事。
    • @Averell 。 . . “我想选择 counter1 > 0 的所有记录以及之后的记录,按 id 分区并按 epochTime 排序”。如果您有其他问题,请提出问题。
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    相关资源
    最近更新 更多