[英]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
这是加载数据时表格的外观。
我试过了;
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.