PostgreSQL 中的條件超前/滯後函數
您正在嘗試識別屬於B 群組的使用者執行的下一個活動,之後已完成A 組的一項活動。本質上,您需要為每個組找到 B 組的第一個後續活動user.
一種方法是利用條件視窗函數。然而,在 PostgreSQL 中,FILTER 子句只能應用於視窗函數內的聚合函數,而不能應用於核心視窗函數,如 Lead() 或 lag()。
因此,一個可行的解決方案是採用DISTINCT ON 構造與CASE 和視窗函數一起使用:
SELECT name , CASE WHEN a2 LIKE 'B%' THEN a1 ELSE a2 END AS activity , CASE WHEN a2 LIKE 'B%' THEN a2 END AS next_activity FROM ( SELECT DISTINCT ON (name) name , lead(activity) OVER (PARTITION BY name ORDER BY time DESC) AS a1 , activity AS a2 FROM t WHERE (activity LIKE 'A%' OR activity LIKE 'B%') ORDER BY name, time DESC ) sub;
此查詢使用子查詢來:
或者,對於小型活動對於每個使用者的行數有限的資料集,可以使用以下查詢:
SELECT name , activity AS a1 , lead(activity) OVER (PARTITION BY name ORDER BY time DESC) AS next_activity FROM t WHERE (activity LIKE 'A%' OR activity LIKE 'B%') ORDER BY name, time DESC;
此查詢透過直接搜尋A 群組活動並檢索後續活動(無論其所屬組從屬關係如何)來簡化邏輯。
以上是如何在 PostgreSQL 中尋找 A 組活動之後 B 組的下一個活動?的詳細內容。更多資訊請關注PHP中文網其他相關文章!