【问题标题】:How to join and keep only latest rows in SQL (Bigquery)如何在 SQL (Bigquery) 中只加入和保留最新的行
【发布时间】:2021-09-05 09:04:20
【问题描述】:

我正在使用 BigQuery。我的数据集如下所示。基本上,我从一个事件表开始,其中只有在数据更新时才添加一行。我通过交叉连接到 my_date >= event_date 的日历表,将这张表分解为下表。我现在遇到的问题是,当每个 my_date(每个tenancy_id)有两个 event_dates 时,我只想以最新的行结束。 (在这个例子中,这意味着我想删除第 4 行和第 12 行)。实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    您可以使用 row_number() 窗口函数来获取每个 my_date 和tenancy_id 的最新行。

     create table yourtable (Row int, my_date date, event_date date, tenancy_ld int, rent_period varchar(100), rent_amount int, tenancy_start_date date, tenancy_end_date date);
    
     insert into yourtable values(1,    '6/29/2021',    '6/29/2021', 1109,  'FORTN IGHTLY', 67794   ,'03/15/21','8/28/2021');
     insert into yourtable values(2,    '6/29/2021',    '6/29/2021', 1110,  'MONTHLY',      224364  ,'02/14/21','3/14/2022');
     insert into yourtable values(3,    '6/28/2021',    '6/28/2021', 1111,  'FORTN IGHTLY', 70000   ,'02/27/21','4/20/2022');
     insert into yourtable values(4,    '6/29/2021',    '6/28/2021', 1111,  'FORTN IGHTLY', 70000   ,'02/27/21','4/20/2022');
     insert into yourtable values(5,    '6/29/2021',    '6/29/2021', 1111,  'FORTN IGHTLY', 77056   ,'02/27/21','4/20/2022');
     insert into yourtable values(6,    '6/29/2021',    '6/29/2021', 1112,  'WEEKLY',       32830   ,'10/17/20','12/22/2021');
     insert into yourtable values(7,    '6/29/2021',    '6/29/2021', 1113,  'WEEKLY',       73620   ,'07/17/20','2/3/2022');
     insert into yourtable values(8,    '6/25/2021',    '6/25/2021', 1114,  'WEEKLY',       136     ,'09/19/20','4/26/2022');
     insert into yourtable values(9,    '6/26/2021',    '6/25/2021', 1114,  'WEEKLY',       136     ,'09/19/20','4/26/2022');
     insert into yourtable values(10,'6/27/2021',   '6/25/2021', 1114,  'WEEKLY',       136     ,'09/19/20','4/26/2022');
     insert into yourtable values(11,'6/28/2021',   '6/25/2021', 1114,  'WEEKLY',       136     ,'09/19/20','4/26/2022');
     insert into yourtable values(12,'6/29/2021',   '6/25/2021', 1114,  'WEEKLY',       136     ,'09/19/20','4/26/2022');
     insert into yourtable values(13,'6/29/2021',   '6/29/2021', 1114,  'FORTN IGHTLY', 136552  ,'09/19/20','4/26/2022');
    

    查询:

     with cte as
     (
        select my_date, event_date, tenancy_ld, rent_period, rent_amount, 
        tenancy_start_date, tenancy_end_date, row_number()over(partition by tenancy_ld, 
        my_date order by event_date desc) rnk
        from yourtable
     )
     select my_date, event_date, tenancy_ld, rent_period, rent_amount, 
        tenancy_start_date, tenancy_end_date from cte where rnk=1
    

    输出:

    my_date event_date tenancy_ld rent_period rent_amount tenancy_start_date tenancy_end_date
    2021-06-29 2021-06-29 1109 FORTN IGHTLY 67794 2021-03-15 2021-08-28
    2021-06-29 2021-06-29 1110 MONTHLY 224364 2021-02-14 2022-03-14
    2021-06-28 2021-06-28 1111 FORTN IGHTLY 70000 2021-02-27 2022-04-20
    2021-06-29 2021-06-29 1111 FORTN IGHTLY 77056 2021-02-27 2022-04-20
    2021-06-29 2021-06-29 1112 WEEKLY 32830 2020-10-17 2021-12-22
    2021-06-29 2021-06-29 1113 WEEKLY 73620 2020-07-17 2022-02-03
    2021-06-25 2021-06-25 1114 WEEKLY 136 2020-09-19 2022-04-26
    2021-06-26 2021-06-25 1114 WEEKLY 136 2020-09-19 2022-04-26
    2021-06-27 2021-06-25 1114 WEEKLY 136 2020-09-19 2022-04-26
    2021-06-28 2021-06-25 1114 WEEKLY 136 2020-09-19 2022-04-26
    2021-06-29 2021-06-29 1114 FORTN IGHTLY 136552 2020-09-19 2022-04-26

    db小提琴here

    (它在 SQL Server 上实现,但应该与 BigQuery 一起使用)

    【讨论】:

    • 如果此答案对您有帮助,请点击绿色对勾接受。
    【解决方案2】:

    我建议使用qualify:

    select t.*
    from t
    where 1=1
    qualify row_number() over (partition by tenancy_id, event_date
                               order by my_date desc
                              ) = 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 2022-08-05
      • 2018-10-09
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      相关资源
      最近更新 更多