[英]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.