2015-06-23 3 views
0

Я пытаюсь написать простой «отменить» -системы для таблицы со следующей структурой:Update, где столбец имеет наибольшее значение

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 предыдущей строки на null.

Так, в pseudolanguage, запрос нужно будет:

UPDATE [table] SET end_date = NULL 
WHERE element = 1 
    AND start_date = 'highest_start_date_to_be_found_of_this_element' 

Вопрос: что ввести вместо highest_start_date_to_be_found_of_this_element, чтобы заставить его работать?

+0

попробуйте использовать max ([дата]) ..Это может помочь: http: //stackoverflow.com/questions/18839486/how-to-maxdate-and-use-the-in-feature-in-sql-server -in-one-query – praveen

+0

Вы что-нибудь пробовали? –

ответ

2

Это должно дать вам последний start_date для каждой записи, которая имеет такое же значение в элементе, как определенное значение в инструкции обновления. Так что вам нужно изменить его только в одном месте.

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) 
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 
0

Один из способов заключается в использовании подзапросов с TOP и ORDER BY:

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

Это будет обновлять только один ряд. Если вы хотите, чтобы все строки имели максимальную дату начала, используйте with ties в подзапросе.

Смежные вопросы