【发布时间】:2020-09-24 23:52:05
【问题描述】:
表 C(id, type) 包含所有唯一客户 ID 的列表,包括交易和不交易。每个 id 都是唯一的,并且只有一个类型。
Table T(date, id, type, money)是交易表,这里id不唯一。
表 C 的唯一 ID 比 T 中的多,因为并非所有客户端都在进行交易。
T 表中的唯一 id 是 C 表中 id 的子集。
针对 T 表的每种类型的 AVG(money) 和 STD(money) 的 SQL:
SELECT
type,
AVG(money) AS avg_for_active_clients,
STDEV(money) AS stdev_for_active_clients,
COUNT(DISTINCT id) as cnt_active_clients
FROM (
SELECT id , type, sum(money) as money
FROM T
GROUP BY id, type
) A
GROUP BY type
针对 C 表的每种类型的 AVG(money) 和 STD(money) 的 SQL:
SELECT
type,
AVG(money) AS avg_for_all_clients,
STDEV(money) stdev_for_all_clients,
COUNT(DISTINCT id) as cnt_all_clients
FROM (
SELECT C.id, C.type , COALESCE(A.money, 0) as money FROM C
LEFT JOIN (
SELECT id , sum(money) as money
FROM T
GROUP BY id
) A
ON C.id = A.id
) B
GROUP BY type
是否可以将上面的 2 个 SQL 组合成一个 SQL ? 我的数据库是 Redshift。
【问题讨论】:
-
合并如何?请向我们展示样本数据、两个查询的当前结果以及您想要获得的结果。
-
T 表中的“type”字段是否对“id”有完整的功能依赖?换句话说,表T中的“type”和“id”字段之间的关系总是一对一的吗?如果是,那么您的第二个查询是您的第一个查询的超集。
-
id type is 1:1 STDEV and AVG in 2nd query 与 STDEV 和 AVG in 1st 不同,(有 LEFT join and coalesce in 2nd SQL)因此第二个查询不是第一的超集。 T 表很大,我只想扫描一次。
-
我想横向合并,不使用 UNION ALL
标签: sql amazon-web-services amazon-redshift