[英]combine two group by and count conditions into one
在我的表中,變量采用以下結構:在每個ID
,有多行date
變量,在每個日期內,有多行session
變量,在每個會話內,有多行transactions
。 我想group by
條件按 2 group by
查詢表:1)我想按事務行數低於 300 的 ID 清理表組,2)按大於 5 的 ID、日期、會話計數進行分組。
代碼按兩個獨立的塊順序查詢數據,如何將它們合二為一?
# group by ID
CREATE TABLE A as(
SELECT ID, date, session, transaction, v1, v2
FROM data
WHERE ID IN
(SELECT ID
FROM data
GROUP BY ID
HAVING count(*) < 300)
);
# group by ID, session, transaction
CREATE TABLE B as (
SELECT ID, date, session, transaction, v1, v2
FROM A
WHERE ID IN
(SELECT ID
FROM data
GROUP BY ID, date, session
HAVING count(*) > 5));
謝謝
您可以使用公共表表達式來執行一個查詢並針對它進行選擇。 這就像為一個查詢創建一個臨時表。
with data_with_many_sessions (
SELECT ID, date, session, transaction, v1, v2
FROM data
GROUP BY ID, date, session
HAVING count(*) > 5
)
SELECT *
FROM data_with_many_sessions
GROUP BY ID
HAVING count(*) < 300
與子查詢相同的樣子......
SELECT *
FROM (
SELECT ID, date, session, transaction, v1, v2
FROM data
GROUP BY ID, date, session
HAVING count(*) > 5
) as data_with_many_sessions
GROUP BY ID
HAVING count(*) < 300
或者,您可以使用intersect
,它將只返回出現在兩個查詢中的行。
SELECT ID, date, session, transaction, v1, v2
FROM data
GROUP BY ID, date, session
HAVING count(*) > 5
INTERSECT
SELECT ID, date, session, transaction, v1, v2
FROM data
GROUP BY ID
HAVING count(*) < 300
我想按條件按 2 組查詢表:1)我想按事務行數低於 300 的 ID 清理表組,2)按大於 5 的 ID、日期、會話計數進行分組。
我假設你想結合這兩個條件。 您可以使用窗口函數:
select d.*
from (select d.*,
count(*) over (partition by id) as cnt_transaction,
count(*) over (partition by id, date_session) as cnt_id_date_session
from data d
) d
where cnt_transaction < 300 and cnt_id_date_session > 5;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.