簡體   English   中英

如何根據相關行中的最小值/最大值更新行

[英]How to update a row based on min/max values in related rows

我試圖使標題盡可能通用,但我確實有一個非常具體的例子:

我有一個表格,其中我的行有一個 StartDate 和一個 EndDate。 每行也將與一個 ID 相關聯。 為了簡單起見,我們假設開始時每個 EndDate 當前都是 NULL。

我想用以下邏輯填充 EndDates:

X 行的 EndDate 應對應於所有其他行的 StartDates 的最小值,該行的 ID 與 X 行相同,並且 StartDates 大於 X 行的 StartDate。

到目前為止,我提出的唯一解決方案涉及逐行循環並逐行執行更新語句,這具有糟糕的性能。 我對這個有點迷茫。 我使用一個包含我感興趣的行的臨時表(結束日期為空的行)循環遍歷類似下面的內容:

UPDATE BaseTable 
SET EffectiveEndDate=Minimum.Date 
from (
select min(BaseTable.StartDate) as date, TempTable as RowId 

FROM TempTable INNER JOIN BaseTable 
on BaseTable.ID=TempTable.ID 

where TempTable.row=@row 
and BaseTable.StartDate > TempTable.StartDate 
group by TempTable) Minimum 
where BaseTable.Id=Minimum.RowId

如果您指定 RDBMS 會有所幫助,但在 SQL Server 2012 中,您可以使用分析函數LEADLAG 根據您的描述,我認為以下方法可行:

SELECT 
    id, 
    startdate,  
    LAG(startdate) OVER (PARTITION BY id ORDER BY startdate DESC)
FROM Table
ORDER BY id, startdate DESC;

SQL小提琴

編輯:

舊版本的 SQL Server 應該可以實現相同的功能,但是您必須編寫一些代碼來模擬LAG功能,因為它是 SQL Server 2012 中的新功能。

以下是如何執行此操作的示例:

update t
    set EndDate = (select min(t2.StartDate)
                   from t t2
                   where t2.id = t.id and 
                         t2.StartDate > t.StartDate
                  )
    where EndDate is null;

這是標准 SQL,因此它應該在大多數數據庫中運行。 在 MySQL 中,您可能需要額外級別的子查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM