SQL-仅显示符合条件的连续行

时间:2019-10-21 19:17:06

标签: sql

这是示例数据库表。我想编写一个SQL查询,该查询返回一个表,该表显示所有数据,但滤除状态永远不会为E的汽车(因此下面的A1不应显示在结果中),滤除连续出现少于4次的汽车Es(因此下面的A2不应该显示,因为尽管它有4个不同的Es,但它们不是连续的)。因此,结果中只会显示A3。理想情况下,我想查看A3的完整历史记录。因此,即使某些行具有L,它也应该给我trip_order 1至7的行。但这不是必须的,我可以忍受给我看所有连续的Es行(行3到6)。我不知道使用GROUP BY函数是否可行,因为我不想弄乱行的顺序。我不想只知道哪些汽车的历史记录中至少有4个E。我想根据trip_history顺序查看哪些是连续的Es。

CAR_NUMBER   |    STATUS    | TRIP_ORDER
-------------+--------------+------------
A1           |     L        |  1
A1           |     L        |  2
A2           |     L        |  1
A2           |     E        |  2
A2           |     E        |  3
A2           |     E        |  4
A2           |     L        |  5
A2           |     E        |  6
A3           |     L        |  1
A3           |     L        |  2
A3           |     E        |  3
A3           |     E        |  4
A3           |     E        |  5
A3           |     E        |  6
A3           |     L        |  7

1 个答案:

答案 0 :(得分:1)

您可以使用窗口函数来计算连续出现四个E(基于trip_number())的出现次数:

select t.*
from (select t.*,
             sum(case when lag4e = 4 then 1 else 0 end) over (partition by car_number) as car_has_4es
      from (select t.*,
                   sum(case when status = 'E' then 1 else 0 end) over
                       (partition by car_number 
                        order by row_number
                        rows between 3 preceding and current_row
                       ) as lag_4e
            from t
           ) t
      ) t
where car_has_4es > 0;