app_id status modified_date
1 A 2022-10-23
1 B 2022-10-10
1 null 2022-10-05
2 A 2022-11-10
2 B 2022-11-03
3 A 2022-12-15

我需要获取在前面的行中具有值B或NULL的所有状态为A的APP_ID,应该忽略仅具有状态A或其他的行.

上述样例输入表的预期输出为app_id 1和2.

我try 过在FROM子句中使用子查询,但不确定这样做是否正确(而且可能不可能以这种方式正确过滤).

推荐答案

使用窗口函数LAG()判断每行的前status行,但由于LAG()在没有前一行时返回NULL,这是您的要求的有效值,因此还应使用窗口函数COUNT()对前一行进行计数,以确保有前一行:

WITH cte AS (
    SELECT t.*, 
           LAG(t.status) OVER(PARTITION BY t.app_id ORDER BY t.modified_date) prev_status,
           COUNT(*) OVER(PARTITION BY t.app_id ORDER BY t.modified_date) cnt
    FROM tablename t
)
SELECT app_id
FROM cte
WHERE status = 'A' AND cnt > 1 AND (prev_status = 'B' OR prev_status IS NULL);

See the demo.

Sql相关问答推荐

Oracle中的分层查询

出现5次后,将所有正斜杠替换为连字符

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

如何在PostgreSQL中的一列中添加两个文本?

SQL Select 最小优先级

如何计算给定日期前三个月的值以及月初数据?

将FLOAT转换为VARBINARY,然后再转换回FLOAT

在Netezza SQL中将字符DataType转换为整型DataType

PostgreSQL:查找继承表中的特定记录属于哪个表

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

如何根据某个值在where子句中添加某个条件

SQL:如何从时间戳数据生成时间序列并计算不同事件类型的累计总和?

MIN MAX 值与条件绑定

过滤具有一对多关系的两个表之间的数据

在 BigQuery 数据集中查找表大小和占总数据集大小的百分比

T-SQL 查询计算日期在其他列中定义的日期之间绑定的行数

连续几天购买的客户

使用 SAVE TRANSACTION 时 BEGIN 和 COMMIT 语句的数量不匹配

交叉应用 OPENJSON / PIVOT - 错误的顺序

聚合 Athena 中的列