如何在没有连接的情况下编写SQL查询?
最近在一次采访中,我被问到一个问题:如果我有如下表格: 要求是:每天有多少订单和多少发货(基于日期列)-输出需要如下: 我已经编写了以下代码,但面试官要求我编写一个不带连接和联合的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
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,这是否可能?