簡體   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