在SQL中查询每个类别的不同记录数

时间:2018-03-15 19:52:51

标签: sql google-bigquery

我的表格如下所示:

col1 | col2 | col3 | col4 
A    | 1    | 2    | 4
A    | 2    | 5    | 3
A    | 5    | 1    | 6
B    | 3    | 1    | 2
B    | 4    | 4    | 4

我有另一张表,其中记录是唯一的,如下所示:

col1 | col2
A    | 2
B    | 1

我想以Table 1的方式查询n,根据类别Table 1中的值,为Table 2中的每个类别仅过滤Table 2条记录数}。

根据A,我需要为B提取2条记录,为col1 | col2 | col3 | col4 A | 2 | 5 | 3 A | 1 | 2 | 4 B | 3 | 1 | 2 提取1条记录。我需要生成的查询表如下所示:

col4

记录的选择基于按升序排序的=ISBLANK($A1)。我目前正在尝试在BigQuery上执行此操作。

2 个答案:

答案 0 :(得分:2)

您可以使用row_number()join

select t1.col1, t1.col2, t1.col3, t1.col4
from (select t1.*, row_number() over (partition by col1 order by col4) as seqnum
      from table1 t1
     ) t1 join
     table2 t2
     on t2.col1 = t1.col1 and t1.seqnum <= t2.col2
order by t1.col1, t1.col4;

答案 1 :(得分:1)

以下是BigQuery Standard SQL

#standardSQL
WITH `table1` AS (
  SELECT 'A' col1, 1 col2, 2 col3, 4 col4 UNION ALL
  SELECT 'A', 2, 5, 3 UNION ALL
  SELECT 'A', 5, 1, 6 UNION ALL
  SELECT 'B', 3, 1, 2 UNION ALL
  SELECT 'B', 4, 4, 4 
), `table2` AS (
  SELECT 'A' col1, 2 col2 UNION ALL
  SELECT 'B', 1 
)
SELECT t.* 
FROM (
  SELECT ARRAY_AGG(t1 ORDER BY t1.col4) arr, MIN(t2.col2) cnt
  FROM table1 t1 JOIN table2 t2 ON t1.col1 = t2.col1
  GROUP BY t1.col1
), UNNEST(arr) t WITH OFFSET num
WHERE num < cnt

您可以使用问题中的虚拟数据进行测试/播放,如下所示

Row col1    col2    col3    col4     
1   A       2       5       3    
2   A       1       2       4    
3   B       3       1       2    

输出为

dtype_dict ={'airtime':np.float32, 'Cancelled':np.uint8 ....