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