簡體   English   中英

將兩個 group by 和 count 條件合二為一

[英]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.

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