首頁 >資料庫 >mysql教程 >如何在 PostgreSQL 中尋找 A 組活動之後 B 組的下一個活動?

如何在 PostgreSQL 中尋找 A 組活動之後 B 組的下一個活動?

Barbara Streisand
Barbara Streisand原創
2025-01-01 07:17:081023瀏覽

How to Find the Next Activity of Group B Following Group A Activities in PostgreSQL?

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;

此查詢使用子查詢來:

  1. 使用DISTINCT ON (name) 用於識別每個使用者來自A 群組的最新活動(a1)。
  2. 應用 Lead() 取得每行的下一個活動 (a2)。
  3. 利用 CASE並 LIKE 'B%' 來偵測並指派下一個活動(如果它屬於 B 組)。

或者,對於小型活動對於每個使用者的行數有限的資料集,可以使用以下查詢:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn