首页 > 解决方案 > 将两个 group by 和 count 条件合二为一

问题描述

在我的表中,变量的结构如下:在 eachID中,有多行date变量,在每个日期中,有多行session变量,在每个会话中,有transactions. 我想按 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));

谢谢

标签: sqlpostgresqlgroup-bycount

解决方案


我想按条件按 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;

推荐阅读