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

如何在 PostgreSQL 中找到 A 組最後一個活動之後 B 組的後續活動?

Barbara Streisand
Barbara Streisand原創
2024-12-28 05:31:10964瀏覽

How Can I Find the Subsequent Activity from Group B After the Last Activity from Group A in PostgreSQL?

PostgreSQL 中的條件超前/滯後函數

您有一個包含不同使用者和時間戳的活動的表。您希望確定每個使用者在 A 組中的最後一個活動,然後確定 B 組中的後續活動(如果有)。

使用引導函數

最初,您嘗試使用lead()函數來解決這個問題。但是,lead() 函數本身不足以完成此任務,因為它只是按順序檢索下一個值,而不管任何條件。

條件視窗函數(FILTER)

為了有效地將條件應用於視窗函數,PostgreSQL 提供了 FILTER 子句。不幸的是,該子句目前尚未針對真正的視窗函數(如 Lead() 和 lag())實現,因為它僅適用於聚合函數。

使用DISTINCT ON 的替代解決方案

為了在沒有FILTER 的情況下解決這一挑戰,我們可以結合使用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;

此方法利用DISTINCT ON子句按使用者對行進行分組,並為每個使用者從 A 群組中選擇最後一個符合條件的活動。 CASE 語句用於根據指定的條件決定適當的活動和後續活動。

大型資料集的最佳解決方案

對於涉及大量行的情況對於每個用戶,替代技術可能更有效。這些技術通常涉及建立臨時表或使用進階索引策略。但是,最佳方法可能會有所不同,具體取決於您的資料和工作負載的特定特徵。

以上是如何在 PostgreSQL 中找到 A 組最後一個活動之後 B 組的後續活動?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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