【发布时间】:2021-07-21 13:25:18
【问题描述】:
要了解具有多种状态的业务流程,
我想根据created_at 列获取具有以下规则的行:
-
第一行状态
‘created’ -
‘missing_info’之后的最后一行‘created’(row_no 4) -
‘pending’的第一行(row_no 5) -
‘missing_info’之后的最后一行‘pending’(row_no 7) -
‘pending’在'missing_info'之后的第一行(row_no 8) -
‘successful’的最后一行(row_no 10)
下面我突出显示了我要检索的行。
这是DB-FIDDLE上的示例数据
以下是一般流程:已创建 > missing_info > 待处理 > 成功。但也只能是这样:创建 > 成功。
我知道我可以将QUALIFY 与窗口函数一起使用,并且可以得到'created' 和'successful',如下所示。但我不知道如何获得临时状态。我怎样才能达到预期的输出?
created AS(
SELECT *
FROM t1
WHERE status = 'created'
QUALIFY ROW_NUMBER() OVER (PARTITION BY STATUS, id ORDER BY created_at) = 1 )
请注意created 和successful 是开始和结束状态,所以输出中只有一行。其他像 missing_info 或 pending 是临时状态,因此可以在所需的输出中包含多个。
编辑:
要了解具有多种状态的业务流程,
我想根据created_at 列获取一些具有以下两条规则的行:
-
“待定”之前状态“missing_info”的最后一行(第 2 行)
-
待定(第 3 行)
-
“待定”之前状态“missing_info”的最后一行(第 5 行)
-
待定(第 6 行)
示例数据:
WITH t1 AS (
SELECT 'A' AS id, 'missing_info' AS status, '2021-07-15 11:10:00'::timestamp AS created_at UNION ALL
SELECT 'A' AS id, 'missing_info' AS status, '2021-07-15 11:20:00'::timestamp AS created_at UNION ALL
SELECT 'A' AS id, 'pending' AS status, '2021-07-15 11:30:00'::timestamp AS created_at UNION ALL
SELECT 'A' AS id, 'missing_info' AS status, '2021-07-15 12:10:00'::timestamp AS created_at UNION ALL
SELECT 'A' AS id, 'missing_info' AS status, '2021-07-15 12:20:00'::timestamp AS created_at UNION ALL
SELECT 'A' AS id, 'pending' AS status, '2021-07-15 12:30:00'::timestamp AS created_at
)
SELECT *
FROM t1
期望的输出:
【问题讨论】:
-
我不明白你的规则和结果。第二和第四应该返回相同的行。
-
2号和4号是什么意思?这是一般流程:已创建 > 缺失信息 > 待处理 > 成功。但也只能是这样:创建>成功。如前所述,创建和成功是开始和结束状态。另外两个是临时状态。
-
@kimi 不管规则如何,您似乎都可以使用MATCH_RECOGNIZE,它专门用于查找一组行的模式。
-
@LukaszSzozda 感谢您的评论!您知道如何通过使用 MATCH_RECOGNIZE 来查找中间行来定义模式吗?如果我的问题不清楚,请告诉我。我尽量让它更简单、更清晰。
-
@kimi 当然,我提供了一个简单的演示,随意修改模式以满足您的确切需求并扩展措施部分:)
标签: sql snowflake-cloud-data-platform window-functions match-recognize