首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigQuery:连接2个表,但只根据日期列选择行

BigQuery:连接2个表,但只根据日期列选择行
EN

Stack Overflow用户
提问于 2022-05-26 18:33:09
回答 1查看 494关注 0票数 1

我有两张桌子

第一个表table_new_data如下

代码语言:javascript
复制
date    type  data
2022-01 t1    0
2022-03 t2    1
2021-08 t1    1

第二个表table_old_data如下

代码语言:javascript
复制
date    type  data
2021-10 t1    2
2022-04 t2    3
2021-07 t1    4
2021-06 t1    5

我想要一个table_new_data LEFT JOIN table_old_data的sql代码片段,并产生以下结果。

代码语言:javascript
复制
new_date type new_data old_date  old_data
2022-01  t1   0        2021-10   2
2022-03  t2   1        null      null
2021-08  t1   1        2021-07   4

请注意,

  • 只使用相同的table_new_data中的每一行加入行,只与table_old_data中具有最接近以前的 date的行连接。例如,对于table_old_data.

中的2021-08 t1 1,我们只想在table_new_data中加入2021-07 t1 4

date在YYYY.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-26 21:27:00

见下文..。想想边缘案件。

代码语言:javascript
复制
--  ---------------------------------------------------------------------------------
--  create dummy NEW table 
--  ---------------------------------------------------------------------------------
WITH
  table_new_data AS (
  SELECT
    '2022-01' AS date,
    't1' AS type,
    0 AS DATA
  UNION ALL
  SELECT
    '2022-03',
    't2' ,
    1 
  UNION ALL
  SELECT
    '2021-08' ,
    't1' ,
    1  ),
--  ---------------------------------------------------------------------------------
--  create dummy OLD table 
--  ---------------------------------------------------------------------------------
  table_old_data AS (
  SELECT
    '2021-10' AS date,
    't1' AS type,
    2 AS DATA
  UNION ALL
  SELECT
    '2022-04',
    't2',
    3 
  UNION ALL
  SELECT
    '2021-07',
    't1',
    4
  UNION ALL
  SELECT
    '2021-06',
    't1',
    5),
--  ---------------------------------------------------------------------------------
--  create joined tables based on dates from old table being LOWER (may need <=??)
--  create order = ROW_NUMBER() function to see which date is closest from old table
--  make sure to test on edge cases where dates are the same or equal to
--  ---------------------------------------------------------------------------------
  ordered AS (
  SELECT
    nd.date AS new_date,
    nd.type,
    nd.DATA AS new_data,
    od.date AS old_date,
    od.DATA AS old_data,
    ROW_NUMBER() OVER(PARTITION BY nd.type, nd.date ORDER BY nd.date ) AS rn
  FROM
    table_new_data nd
  LEFT JOIN
    table_old_data od
  ON
    nd.type = od.type
    AND od.date < nd.date )
--  ---------------------------------------------------------------------------------
--  final table to reproduce desired output in question
--  ---------------------------------------------------------------------------------
SELECT
  * EXCEPT(rn)
FROM
  ordered
WHERE
  rn = 1

输出:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72396487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档