sql - 在 Google BigQuery 中的最近日期左加入

标签 sql google-bigquery

我有两张表,都有时间戳和更多数据:

表 A

| name | timestamp           | a_data |
| ---- | ------------------- | ------ |
| 1    | 2018-01-01 11:10:00 | a      |
| 2    | 2018-01-01 12:20:00 | b      |
| 3    | 2018-01-01 13:30:00 | c      |

表 B

| name | timestamp           | b_data |
| ---- | ------------------- | ------ |
| 1    | 2018-01-01 11:00:00 | w      |
| 2    | 2018-01-01 12:00:00 | x      |
| 3    | 2018-01-01 13:00:00 | y      |
| 3    | 2018-01-01 13:10:00 | y      |
| 3    | 2018-01-01 13:10:00 | z      |

我想做的是

  1. Table A LEFT JOIN 中的每一行 Table B 中的最新记录早于它。
  2. 如果有多种可能性,则选择最后一种

目标结果

| name | timestamp           | a_data | b_data |
| ---- | ------------------- | ------ | ------ |
| 1    | 2018-01-01 11:10:00 | a      | w      |
| 2    | 2018-01-01 12:20:00 | b      | x      |
| 3    | 2018-01-01 13:30:00 | c      | z      | <-- note z, not y

我认为这涉及一个子查询,但我无法让它在 Big Query 中工作。到目前为止我所拥有的:

SELECT a.a_data, b.b_data
FROM `table_a` AS  a  

LEFT JOIN `table_b` AS b 
ON a.name = b.name

WHERE a.timestamp = (
  SELECT max(timestamp) from `table_b` as sub
  WHERE sub.name = b.name
  AND sub.timestamp < a.timestamp
)

在我的实际数据集上,这是一个非常小的测试集(小于 2Mb),查询运行但从未完成。任何指针都非常感谢👍🏻

最佳答案

您可以尝试使用选择子查询。

SELECT a.*,(
    SELECT MAX(b.b_data) 
    FROM `table_b` AS b 
    WHERE 
        a.name = b.name 
    and  
        b.timestamp < a.timestamp
) b_data 
FROM `table_a` AS  a

编辑

或者您可以尝试在子查询中使用 ROW_NUMBER 窗口函数。

SELECT name,timestamp,a_data , b_data
FROM (
    SELECT a.*,b.b_data,ROW_NUMBER() OVER(PARTITION BY a.name ORDER BY b.timestamp desc,b.name desc) rn 
    FROM `table_a` AS  a  
    LEFT JOIN `table_b` AS b ON a.name = b.name AND b.timestamp < a.timestamp
) t1
WHERE rn = 1

关于sql - 在 Google BigQuery 中的最近日期左加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53726282/

相关文章:

google-bigquery - 预留容量选项仍然可用吗?

google-bigquery - BigQuery 如何查询嵌套字段

MySQL 一张4GB表或80张小表

mysql - 如何获得过去 30 天内超过 1000 美元的用户?每个用户过去 30 天的数据。 SQL有限制

sql - 如何将这 2 个查询合并为 1?

java - 谷歌数据流: PCollection<String> to PCollection<TableRow> for BigQuery insertion

google-bigquery - Bigquery 使用 Terraform 从 Sheet 文件创建表

sql - 深度嵌套子查询分解 (CTE) 性能缓慢

复杂查询的 MySQL 语法错误

python - 使用 google-cloud-python 从 BigQuery 以 JSON 格式获取结果