对不起,标题:),我找不到适合这个问题的适当标题。
我有一个表,我只想在SQL大查询中最多统计一定数量的事件。例如
A B C
abc ab 80
abc ab 80
abc ab 80
bcd ah 90
解决方案按A分组 如果我按分组给它计算A列(abc)的所有出现次数
A B C count
abc ab 80 2 *
abc ab 80 1 *
bcd ah 90 1
其中*表示阈值和行值分割
我希望阈值具有2。因此我们可以对其进行限制
答案 0 :(得分:2)
我们可以尝试在A
,B
,C
上创建一个分区,并将行号减一除以二:
WITH cte AS (
SELECT A, B, C,
(ROW_NUMBER() OVER (PARTITION BY A, B, C ORDER BY A, B, C) - 1) / t2.th AS rn
FROM yourTable t1
INNER JOIN threshholds t2
ON t1.A = t2.A
)
SELECT A, B, C, COUNT(*) AS count
FROM cte
GROUP BY A, B, C, rn
ORDER BY A, B, C, COUNT(*) DESC;
这假定存在第二个表threshholds
,该表保留每个组的不同阈值。
答案 1 :(得分:1)
以下是用于BigQuery标准SQL
#standardSQL
SELECT * EXCEPT(grp), COUNT(1) AS count
FROM (
SELECT a, b, c, DIV(ROW_NUMBER() OVER(PARTITION BY a, b, c) - 1, 2) grp
FROM `project.dataset.table`
) t
GROUP BY a, b, c, grp
如果要应用于您的问题的样本数据-结果将为
Row a b c count
1 abc ab 80 1
2 abc ab 80 2
3 bcd ah 90 1
当每个组的阈值不同时,如何解决此问题。假设abc是2,可能是bcd,可能是3,依此类推
#standardSQL
WITH thresholds AS (
SELECT 'abc' a, 2 threshold UNION ALL
SELECT 'bcd', 3
)
SELECT a, b, c, COUNT(1) AS count
FROM (
SELECT a, b, c,
DIV(ROW_NUMBER() OVER(PARTITION BY a, b, c) - 1, threshold) grp
FROM `project.dataset.table` x
JOIN thresholds y USING(a)
) t
GROUP BY a, b, c, grp