1

我有多个查询,如下所示:

select count(*) from (
  SELECT * FROM TABLE1 t 
  JOIN TABLE2 e 
  USING (EVENT_ID)
) s1
WHERE
s1.SOURCE_ID = 1;

唯一的区别是t1.SOURCE_ID = (some other number). 我想将这些转换为一个查询,该查询仅从子查询中选择,SOURCE_ID对结果中的每一列使用不同的列,如下所示:

+----------------+----------------+----------------+
| source_1_count | source_2_count | source_3_count | ... so on
+----------------+----------------+----------------+

我试图避免使用多个查询,因为连接在一个非常大的表上并且需要一些时间,所以我宁愿做一次并多次查询结果。

这是在一个雪花数据仓库上,我认为它使用类似于 PostgreSQL 的东西(我对 SQL 也很陌生,所以也可以随意提出一个完全不同的解决方案)。

4

3 回答 3

1

使用条件聚合

SELECT sum(case when sourceid=1 then 1 else 0 end) source_1_count, sum(case when sourceid=2 then 1 else 0 end) source_2_count...
  FROM TABLE1 t 
  JOIN TABLE2 e 
  USING (EVENT_ID)
于 2018-04-11T19:24:10.630 回答
1

您可以将结果放在单独的行中,使用group by

SELECT SOURCE_ID, COUNT(*) 
FROM TABLE1 t JOIN
     TABLE2 e 
     USING (EVENT_ID)
GROUP BY SOURCE_ID;

将单独的源放在列中很麻烦,除非您知道结果集中需要的源的确切列表。

编辑:

如果您知道确切的来源列表,则可以使用条件聚合或pivot

SELECT SUM(CASE WHEN SOURCE_ID = 1 THEN 1 ELSE 0 END) as source_id_1,
       SUM(CASE WHEN SOURCE_ID = 2 THEN 1 ELSE 0 END) as source_id_2,
       SUM(CASE WHEN SOURCE_ID = 3 THEN 1 ELSE 0 END) as source_id_3
FROM TABLE1 t JOIN
     TABLE2 e 
     USING (EVENT_ID);
于 2018-04-11T19:16:31.080 回答
0

到目前为止,所有评论都忽略了这样一个事实,即您不会在扫描期间获得修剪数据的好处,因为没有WHERE谓词。因此,加入也可能比它需要的慢。

这是一个可能的改进:

SELECT SUM(CASE WHEN SOURCE_ID = 1 THEN 1 ELSE 0 END) as source_id_1,
       SUM(CASE WHEN SOURCE_ID = 2 THEN 1 ELSE 0 END) as source_id_2,
       SUM(CASE WHEN SOURCE_ID = 3 THEN 1 ELSE 0 END) as source_id_3
FROM TABLE1 t JOIN
     TABLE2 e 
     USING (EVENT_ID);
WHERE SOURCE_ID IN (1, 2, 3)
于 2018-04-16T05:41:45.797 回答