如何在没有连接的情况下编写SQL查询?

如何在没有连接的情况下编写SQL查询?,sql,google-bigquery,Sql,Google Bigquery,最近在一次采访中,我被问到一个问题:如果我有如下表格: 要求是:每天有多少订单和多少发货(基于日期列)-输出需要如下: 我已经编写了以下代码,但面试官要求我编写一个不带连接和联合的SQL查询,以实现相同的输出 SELECT COALESCE(a.order_date, b.ship_date), orders, shipments FROM (SELECT order_date, COUNT(1) AS orders FROM

最近在一次采访中,我被问到一个问题:如果我有如下表格:

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

我已经编写了以下代码,但面试官要求我编写一个不带连接和联合的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

这可能吗?你们能给点建议吗?

你们可以使用
UNION
groupby
进行条件聚合,如下所示:

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

在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移动数据。

不需要连接。GROUP BY和use case表达式进行条件聚合。请提供示例代码。如果没有UNION,这是否可能?