【问题标题】:How to write SQL query without join?如何编写没有连接的 SQL 查询?
【发布时间】:2021-03-20 16:26:18
【问题描述】:

最近在一次面试中被问到一个问题:如果我有如下表:

要求是:每天有多少订单和多少发货(基于日期列) - 输出需要是这样的:

我写了以下代码,但是面试官要求我写一个没有JOIN和UNION的SQL查询,实现相同的输出。

SELECT 
    COALESCE(a.order_date, b.ship_date), orders, shipments 
FROM
    (SELECT 
         order_date, COUNT(1) AS orders 
     FROM 
         table 
     GROUP BY 1) a
FULL JOIN 
    (SELECT
         ship_date, COUNT(1) AS shipments 
     FROM table) b ON a.order_date = b.ship_date

这可能吗?各位大侠能指教一下吗?

【问题讨论】:

  • 无需加入。 GROUP BY 和用例表达式进行条件聚合。
  • 请提供示例代码

标签: sql google-bigquery


【解决方案1】:

您可以将UNIONGROUP BY 与条件聚合一起使用,如下所示:

SELECT DATE_, 
       COUNT(CASE WHEN FLAG = 'ORDER' THEN 1 END) AS ORDERS,
       COUNT(CASE WHEN FLAG = 'SHIP' THEN 1 END) AS SHIPMENTS
 FROM (SELECT ORDER_DATE AS DATE_, 'ORDER' AS FLAG FROM YOUR_TABLE
       UNION ALL
       SELECT SHIP_DATE AS DATE_, 'SHIP' AS FLAG FROM YOUR_TABLE) T

【讨论】:

  • 如果没有 UNION,这可能吗?
【解决方案2】:

在 BigQuery 中,我会将其表示为:

select date, countif(n = 0) as orders, countif(n = 1) as numships
from t cross join
     unnest(array[order_date, ship_date]) date with offset n
group by 1
order by date;

这种方法(超过union all)的优势是双重的。首先,它只扫描表一次。更重要的是,unnest() 都位于数据所在的同一节点上——因此不需要为 unpivot 移动数据。

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2016-06-14
    • 2021-07-25
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多