簡體   English   中英

SQL:按組選擇行,直到滿足條件

[英]SQL: Select rows by group until a condition is met

如果提供以下用戶在特定時間戳下采取的操作的示例表:

id |    ts     | action
---+-----------+------
 1 | 10039000  | scroll_10
 1 | 10039002  | scroll_20
 1 | 10039004  | click
 1 | 10039006  | scroll_30
 2 | 10044000  | scroll_10
 2 | 10044002  | bounce

我需要能夠針對每個ID在第一個non-scroll操作之前提取結果。

如果在第一個non-scroll操作之后的timestamps為每個用戶還有其他scroll actions ,則不應將其拉出。

上面的示例的預期輸出為:

id | action
---+-------
 1 | scroll_10
 1 | scroll_20
 2 | scroll_10

我嘗試了以下查詢:

SELECT id, action
FROM user_actions
WHERE ts < (SELECT MIN(ts)
            FROM user_actions
            WHERE action NOT LIKE '%scroll%'
            )

這給了我以下結果:

id | action
---+-------
 1 | scroll_10
 1 | scroll_20

所以這對於第一個“ id”是正確的,但是我需要它然后為下一個“ id”尋找下一個“非滾動”動作並將其包含在返回值中,我似乎無法做到這一點。 試圖“自我聯接”到同一張表,但似乎不太正確。

您可以使用相關子查詢:

select t.*
from t
where t.timestamp < (select min(t2.timestamp)
                     from t t2
                     where t2.id = t.id and t2.action not like 'scroll%'
                    );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM