arrays - BigQuery LEFT JOIN 一个表并根据条件过滤其数组元素
问题描述
我想将一个表连接到另一个包含数组的表,并且在连接结果中我只想拥有通过条件的数组元素。在这种情况下,日期条件。下面的代码片段说明了我的问题。我希望输出仅ids
包含record_dates
小于 '2019-10-15'
WITH platform AS (
SELECT 'u1' AS id, 'm1' AS platform_id, '2019-10-12' as record_date
UNION ALL
SELECT 'u2' AS id, 'm1' AS platform_id, '2019-10-13' as record_date
UNION ALL
SELECT 'u21' AS id, 'm1' AS platform_id, '2019-10-16' as record_date
),
platform_agg AS (
SELECT platform_id
, ARRAY_AGG(id) as ids
, ARRAY_AGG(record_date) as record_dates
FROM platform
GROUP BY platform_id
),
orders AS(
SELECT 'u2' AS id, 'c1' AS order_id, '2019-10-15' as order_date
),
orders_plus_platform AS (
SELECT order_id
, orders.id
, orders.order_date
, platform.platform_id
, CASE WHEN platform.platform_id IS NOT NULL THEN platform_agg.ids ELSE [orders.id] END AS ids
, CASE WHEN platform.platform_id IS NOT NULL THEN platform_agg.record_dates ELSE NULL END AS record_dates
FROM orders
LEFT JOIN platform
ON orders.id = platform.id and platform.record_date <= orders.order_date
LEFT JOIN platform_agg
ON platform.platform_id = platform_agg.platform_id
)
SELECT * FROM orders_plus_platform
以下是当前查询输出,但是,在所需的输出中,u21
应过滤掉元素,因为 record_date 在“2019-10-15”之后。
谢谢,
解决方案
以下解决方案对我有用。基本上,您将两次加入平台表以获取与平台关联的所有 id,而不是加入平台的预聚合版本。这样,您可以更轻松地应用过滤器。
orders_plus_platform AS (
SELECT order_id
, orders.id
, orders.order_date
, platform.platform_id
, ARRAY_AGG(CASE WHEN platform.platform_id IS NOT NULL THEN platform2.id ELSE orders.id END) AS ids
, ARRAY_AGG(CASE WHEN platform.platform_id IS NOT NULL THEN platform2.record_date ELSE NULL END) AS record_dates
FROM orders
LEFT JOIN platform
ON orders.id = platform.id and platform.record_date <= orders.order_date
LEFT JOIN platform platform2
ON platform.platform_id = platform2.platform_id AND platform2.record_date <= orders.order_date
GROUP BY
order_id
, orders.id
, orders.order_date
, platform.platform_id
)
推荐阅读
- c# - C# 修改身份或添加声明
- c++ - 从 Doxygen 中删除源代码但保留方法参数名称
- mysql - ClickHouse SQL 数据库中产品可用性的完整性分析
- c++ - c ++ if语句中的奇怪范围
- javascript - 我在 React 中收到此错误 - TypeError: Cannot create property 'completed' on boolean 'true'
- python - 如何从局部位置描述的分层骨架转换为全局坐标?
- javascript - 使用 Emitery 编写异步代码。如何告诉我的 while 循环停止?
- python-3.x - 如何在 docker 容器中运行 3 个依赖进程 - Python
- c# - Xamarin 窗体 CarouselView:子元素并不总是实例化
- javascript - SAPUI5在按钮按下时打开链接