繁体   English   中英

SQL 服务器更新行,其中日期不是按某个 ID 对记录分组时的最大日期

[英]SQL Server Update Row where date is not the max date when records are grouped by some ID

我有一张表,每天都会在其中加载我的帐户记录。 如果一个帐户进入表并且它已经存在,我将两个记录都保存在数据库中,但需要使用较旧的 record_date 将其 end_date 设置为今天来更新记录。 Account_ID 是唯一的帐户标识符。 其次,如果记录日期相同,我会保留可以通过 table_ID 身份字段识别的较新条目。

例如

TABLE_ID,account_ID,end_date,record_date
2   28576800    NULL    2020-10-20
23  28576800    NULL    2020-10-20
20  32477400    NULL    2020-11-09
22  32477400    NULL    2020-11-13

更新前的表格截图

这是加载数据时表格的外观。

  1. 我需要更新行 table_id=20 中的 end_date,因为行 table_id=22 具有更新的记录日期。
  2. 我需要更新 table_id=2 行中的 end_date 因为因为 record_dates 是相同的,所以我们结束了较小的 table_ID

我试过了;

UPDATE dbo.accounts
SET END_DATE = GETUTCDATE()
where END_DATE is null
and  Record_date not in
(SELECT MAX(Record_date ) as mxrptDate
         FROM dbo.accounts
         GROUP BY account_ID)  

这不能按预期工作,因为它并不专门针对我要更新的特定 account_iD 的 max(record_date)。

因为当记录日期相同时,我使用相同类型的查询,我认为它有效,因为 table_id 是唯一的。 但是感觉一定有更好的方法。

    UPDATE dbo.accounts
    SET END_DATE = GETUTCDATE()
    where END_DATE is null
    and  table_id not in
    (SELECT MAX(table_id ) as mxtblid
  FROM dbo.accounts
GROUP BY account_ID)  

您的第二个查询几乎就在那里,您只需要关联子查询:

UPDATE ac
SET END_DATE = GETUTCDATE()
FROM dbo.accounts ac
where ac.END_DATE is null
  and ac.table_id <>
    (SELECT MAX(table_id) as mxtblid
      FROM dbo.accounts ac2
    WHERE ac2.account_ID = ac.account_ID)  

但是我们也可以使用 window 函数来解决这个问题,而无需借助自连接。 这可能或多或少的性能,做测试。

我们可以用子查询 select 正确的行,并直接更新这些行:

UPDATE ac
SET END_DATE = GETUTCDATE()
FROM (
    SELECT *,
        rn = ROW_NUMBER() OVER (PARTITION BY account_ID ORDER BY TABLE_ID DESC)
    FROM dbo.accounts ac
    where ac.END_DATE is null
) ac
WHERE ac.rn > 1;

编辑

看来您还想按日期订购

最终解决方案将找到最新的record_date,或者如果该日期有多个记录,则采用最高的table_id:

UPDATE ac
SET END_DATE = GETUTCDATE()
FROM (
    SELECT *,
        rn = ROW_NUMBER() OVER (PARTITION BY account_ID ORDER BY record_date desc, TABLE_ID DESC)
    FROM dbo.accounts ac
    where ac.END_DATE is null
) ac
WHERE ac.rn > 1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM