代码之家  ›  专栏  ›  技术社区  ›  drec4s

按日期仅保留最近的行

  •  2
  • drec4s  · 技术社区  · 6 年前

    有这张桌子

    CREATE TABLE BOOKINGS
        ([RES_ID] varchar(4), [ATTENDANCE_DATE] datetime, [AUTOID] int);
    
    INSERT INTO BOOKINGS
        ([RES_ID], [ATTENDANCE_DATE], [AUTOID])
    VALUES
        ('A001', '2018-01-01 00:00:00', 1),
        ('A002', '2018-01-01 00:00:00', 2),
        ('A003', '2018-01-01 00:00:00', 3),
        ('A001', '2018-01-02 00:00:00', 4),
        ('A002', '2018-01-02 00:00:00', 5),
        ('A003', '2018-01-02 00:00:00', 6),
        ('A002', '2018-01-03 00:00:00', 7),
        ('A003', '2018-01-03 00:00:00', 8);
    

    我想删除所有行 id='A001' 因为在最近的日期,没有保留(即取消)。

    我试过这个:

    with cte as
    (
      select *,
        row_number() over(partition by [res_id]
                          order by  [ATTENDANCE_DATE] desc) rn
      from BOOKINGS
    )
    DELETE FROM cte where rn > 1;
    

    但这是最近一次 'A001' (id=4)我不想要。

    预期产量为:

    A002    2018-01-03 00:00:00.000 7
    A003    2018-01-03 00:00:00.000 8
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   drec4s    6 年前

    一种方法是比较每个 resid 到最近的一天。您可以使用窗口函数来实现这一点:

    with todelete as (
          select b.*,
                 max(attendance_date) over (partition by res_id) as max_ad_resid,
                 max(attendance_date) over () as max_ad
          from bookings b
         )
    delete from todelete
        where max_ad_resid < max_ad;
    
        2
  •  0
  •   ppijnenburg    6 年前

    这就是你要找的吗?

            DELETE FROM BOOKINGS WHERE
        [ATTENDANCE_DATE] <= (SELECT MAX([ATTENDANCE_DATE]) FROM BOOKINGS where RES_ID = 'A001')
    

    这将获取res_id a001(无保留)的最大日期,并删除等于或早于该日期的所有条目。

        3
  •  0
  •   Radim Bača    6 年前

    你可以这样删除

    delete
    from BOOKINGS
    where ATTENDANCE_DATE != (
      select max(ATTENDANCE_DATE) from BOOKINGS
    )