这是示例数据库表。我想编写一个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
答案 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;