我有这个数据:
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
我将不胜感激任何帮助。
--鲍勃
我们应该使用如下窗口函数:
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;