0

我试图使标题尽可能通用,但我确实有一个非常具体的例子:

我有一个表格,其中我的行有一个 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
4

2 回答 2

0

如果您指定 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 中的新功能。

于 2013-06-21T19:03:55.267 回答
0

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

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 中,您可能需要额外级别的子查询。

于 2013-06-21T19:04:05.360 回答