我有一张table test
带列 Batch
以及 ID
. 我想计算一下,与最早的批相比,每个批中缺少多少ID,比如比较第2批和第1批中下面第2批的值。
SELECT COUNT(T1.ID) AS LOST_CNT FROM
(SELECT * FROM TEST WHERE BATCH=1)T1
LEFT JOIN (SELECT * FROM TEST WHERE BATCH=2)T2
ON T1.ID=T2.ID WHERE T2.ID IS NULL
我想得到 lost_cnt
随着时间的推移,每批的数量都会增加。像下面这样的东西并不能返回我想要的东西(我明白为什么,只是把它作为失败的尝试放在这里)
SELECT A.BATCH,
COUNT(DISTINCT CASE WHEN A.ID IS NULL THEN M.ID ELSE NULL END) AS lost_cnt
FROM
(SELECT DISTINCT ID FROM TEST WHERE BATCH=(SELECT MIN(BATCH) FROM TEST)) M
LEFT JOIN TEST A ON M.ID=A.ID
GROUP BY 1;
有办法得到我想要的吗?
3条答案
按热度按时间rm5edbpk1#
你可以用
lag
用于查找上一批的分析函数,如果上一批中存在id,则使用NOT EXISTS
具体如下:1bqhqjot2#
在hive中,我将使用窗口函数来实现这一点:
13z8s7eq3#
现在还不完全清楚您想要实现什么,但是我猜您想要找到与第一批相比丢失了多少id。您只需使用第一批中的id筛选表,计算每个批中的id数,然后从第一批的计数中减去。
样本数据:
结果: