SQL 计数结果按组分组,并且组重复

问题描述 投票:0回答:1

我有这个数据:

ARRIVAL,ITEM_TYPE,ITEM
1,0,Cat
2,0,Dog
3,1,Horse
4,1,Cow
5,0,Fish
6,0,Barn
7,0,Potato

我想查询这个结果:

0,2
1,2
0,3

...显示按到达顺序,有一组 ITEM_TYPE = 0 的 2 个项目,然后是 2 个 ITEM_TYPE = 1 的项目,然后是 另一个 组 ITEM_TYPE = 0。目标是提供有关到达的信息类似记录组的系统; Cat 和 Dog 与 Fish、Barn 和 Potato 处于相同的 ITEM_TYPE,但它们没有到达相同的时间序列组。我不知道如何使用 COUNT、DISTINCT 和 GROUP BY 来避免将两组零折叠成一行,如下所示:

0,5

我将不胜感激任何帮助。

--鲍勃

sql sqlite count group
1个回答
0
投票

我们应该使用如下窗口函数:

CREATE TABLE mytable (ARRIVAL INT, ITEM_TYPE INT,ITEM VARCHAR);

INSERT INTO  mytable(ARRIVAL, ITEM_TYPE,ITEM)
VALUES
  (1,0,'Cat'),
  (2,0,'Dog'),
  (3,1,'Horse'), 
  (4,1,'Cow' ),  
  (5,0,'Fish'),
  (6,0,'Barn'),
  (7,0,'Potato');

    WITH cte as (
    SELECT ARRIVAL, ITEM_TYPE,ITEM
    , CASE WHEN ITEM_TYPE = (lag ( ITEM_TYPE) OVER ( ORDER BY ARRIVAL ) ) OR (lag ( ITEM_TYPE) OVER ( ORDER BY ARRIVAL ) ) IS NULL
    THEN 1 ELSE 0 END check_lag

  
    FROM mytable
  
)
SELECT min(ITEM_TYPE) ITEM_TYPE, COUNT(1) 
FROM (
    SELECT ARRIVAL, ITEM_TYPE,ITEM, ROW_NUMBER() OVER(ORDER BY ARRIVAL)  
      - SUM(check_lag) OVER(ORDER BY ARRIVAL ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS grp
    FROM cte
) sub
GROUP BY grp
ORDER BY grp;

输出:

© www.soinside.com 2019 - 2024. All rights reserved.