更新列具有最高值的位置

时间:2015-06-23 12:51:26

标签: sql sql-server

我正在尝试为具有以下结构的表编写一个简单的“undo”系统:

id    element    position    start_date    end_date
1       1          23        01/01/2015    05/01/2015
2       2          36        01/01/2015    NULL
3       1          17        05/01/2015    NULL

因此,当为现有元素添加新操作时,它会添加一个包含新位置和当前日期的新行,并将该元素前一行的end_date更改为当前日期。

现在,为了撤消这个,我删除了没有定义end_date的元素行(这是该元素的最新动作),但是我必须将前一行的end_date更改为{{1} }。

因此,在伪语言中,所需的查询将是:

null

问题:要键入什么而不是UPDATE [table] SET end_date = NULL WHERE element = 1 AND start_date = 'highest_start_date_to_be_found_of_this_element' 才能使其正常工作?

3 个答案:

答案 0 :(得分:3)

这应该为每个在元素中具有相同值的条目提供最新的start_date,就像update语句中定义的值一样。 所以你只需要在一个地方改变它。

UPDATE [table] t SET t.end_date = NULL WHERE t.element = 1 AND t.start_date = (select max(sub.start_date) from [table] sub where sub.element = t.element)

答案 1 :(得分:0)

您可以使用:

CREATE TABLE #temp(id int, start_date date)

INSERT INTO #temp(id, start_date) 
VALUES(1,GETDATE()),(2,DATEADD(day,-1,GETDATE())),(1,DATEADD(day,+3,GETDATE()))

SELECT *
FROM #temp

-- your part
UPDATE t
SET start_date = m.maxDate
FROM #temp t
INNER JOIN (
    SELECT id, MAX(start_date) as maxDate
    FROM #temp 
    GROUP BY id
) m
    ON t.id = m.id

SELECT *
FROM #temp

DROP TABLE #temp

答案 2 :(得分:0)

一种方法是使用带有TOPORDER BY的子查询:

update t
    set end_date = NULL
    from (select top 1 t.*
          from table t
          order by start_date desc
         );

这将只更新一行。如果您希望所有行都具有最大开始日期,请在子查询中使用with ties