【问题标题】:How to combine 2 SQLs into single SQL如何将 2 个 SQL 组合成一个 SQL
【发布时间】: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


【解决方案1】:

您可以将select #1select #2 垂直或水平组合。

要垂直组合它们,您可以使用UNION ALL。例如:

select #1
union all
select #2

要水平组合它们,您可以使用FULL JOIN。例如:

select *
from (
  select #1
) x
full join (
  select #2
) y on y.type = x.type

【讨论】:

  • 我要横向合并;表 T 很大,我只想查询一次
猜你喜欢
  • 1970-01-01
  • 2019-03-15
  • 2017-09-02
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多