如何计算每个组的阈值出现次数

时间:2019-08-07 04:05:17

标签: sql google-bigquery

对不起,标题:),我找不到适合这个问题的适当标题。

我有一个表,我只想在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。因此我们可以对其进行限制

2 个答案:

答案 0 :(得分:2)

我们可以尝试在ABC上创建一个分区,并将行号减一除以二:

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