从子查询中进行多项选择
Multiple Selects from Subquery
我有多个查询如下所示:
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
+----------------+----------------+----------------+
我试图避免使用多个查询,因为连接在一个非常大的 table 上并且需要一些时间,所以我宁愿做一次并多次查询结果。
这是一个 Snowflake 数据仓库,我认为它使用类似于 PostgreSQL 的东西(而且我对 SQL 还很陌生,所以也可以随意提出一个完全不同的解决方案) .
您可以将结果放在单独的行中,使用 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);
使用条件聚合
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)
到目前为止所有的评论都忽略了这样一个事实,即您不会在扫描过程中获得修剪数据的可能好处,因为没有 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)
我有多个查询如下所示:
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
+----------------+----------------+----------------+
我试图避免使用多个查询,因为连接在一个非常大的 table 上并且需要一些时间,所以我宁愿做一次并多次查询结果。
这是一个 Snowflake 数据仓库,我认为它使用类似于 PostgreSQL 的东西(而且我对 SQL 还很陌生,所以也可以随意提出一个完全不同的解决方案) .
您可以将结果放在单独的行中,使用 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);
使用条件聚合
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)
到目前为止所有的评论都忽略了这样一个事实,即您不会在扫描过程中获得修剪数据的可能好处,因为没有 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)