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

如何使用視窗函數在 PostgreSQL 中尋找 A 組活動之後的 B 組中的下一個活動?

Barbara Streisand
Barbara Streisand原創
2024-12-25 16:54:17544瀏覽

How Can I Find the Next Activity from Group B Following Group A Activities in PostgreSQL Using Window Functions?

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

您的任務是產生一個查詢,從給定表中檢索使用者的特定活動序列。您想要確定每個使用者的 B 組下一個活動(總是在 A 組活動之後發生)。

問題定義

考慮下表:

Name activity time
user1 A1 12:00
user1 E3 12:01
user1 A2 12:02
user2 A1 10:05
user2 A2 10:06
user2 A3 10:07
user2 M6 10:07
user2 B1 10:08
user3 A1 14:15
user3 B2 14:20
user3 D1 14:25
user3 D2 14:30

此表所需的輸出為:

Name activity next_activity
user1 A2 NULL
user2 A3 B1
user3 A1 B2

解決方案

您可以透過利用DISTINCT ON 和CASE 語句結合window 來解決此問題函數:

解釋

  • 子查詢為每個使用者識別A 組中的最新使用者識別活動以及B 組中的以下活動(如果有)使用DISTINCT ON 和視窗函數Lead() 以及ORDER BY time DESC。
  • CASE 語句處理所需輸出:A 組的最新活動,以及 B 組的下一個活動(如果存在)。

條件視窗函數

而PostgreSQL 則這樣做不直接支援條件視窗函數(例如,lead(activity) FILTER (WHERE Activity LIKE 'A% ')),您可以使用帶有聚合函數的FILTER子句並將其用作視窗函數:

但是,這種方法對於大型資料集來說效率低且不切實際。相反,建議針對小型和大型資料集使用上述解決方案。

以上是如何使用視窗函數在 PostgreSQL 中尋找 A 組活動之後的 B 組中的下一個活動?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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