2014-01-06 7 views
0

У меня есть таблица, которая выглядит как этотОбновление несколько строк из группы по SQL

+----------------------------+ 
| id | bdate  | item | 
+----------------------------+ 
| 1 | 20010101 |  1a | 
| 1 | 20020202 |  1b | 
| 1 | 20030303 |  1c | 
| 2 | 20010101 |  1d | 
| 2 | 20020202 |  1e | 
+----------------------------+ 

я хочу, чтобы обновить bdate на сегодняшний день группировки по идентификатору, где bdate не макс. поэтому для результата над результатами будет выглядеть так после выполнения запроса.

+----------------------------+ 
| id | bdate  | item | 
+----------------------------+ 
| 1 | 20140106 |  1a | 
| 1 | 20140106 |  1b | 
| 1 | 20030303 |  1c | 
| 2 | 20140106 |  1d | 
| 2 | 20020202 |  1e | 
+----------------------------+ 

Я придумал результаты с использованием временных таблиц, но хотел бы посмотреть, есть ли у кого-то лучшее предложение.

Спасибо,

ответ

1

ли это так

UPDATE t 
    SET bdate = GETDATE() 
    FROM table1 t LEFT JOIN 
(
    SELECT id, MAX(bdate) bdate 
    FROM table1 
    GROUP BY id 
) e 
    ON t.id = e.id 
    AND t.bdate = e.bdate 
WHERE e.id IS NULL; 

Результат:

 
| ID |  BDATE | ITEM | 
|----|------------|------| 
| 1 | 2014-01-06 | 1a | 
| 1 | 2014-01-06 | 1b | 
| 1 | 2003-03-03 | 1c | 
| 2 | 2014-01-06 | 1d | 
| 2 | 2002-02-02 | 1e | 

Вот SQLFiddle демо

+0

Ну, приятно видеть, что мое решение правильно;) Я предполагаю, что ваш будет быстрее, хотя, так как вы только обновить некоторые строки (тогда как я обновляю все строки, я не хотел использовать предложение WHERE) – Nevoris

0

Я предполагаю, что здесь, что вы уже построили таблицу с данными (как в вашем примере).

Допустим, вы называете таблицу «MainTable», мое взятие будет следующим:

UPDATE MT 
    SET bdate = CASE WHEN MT2.bdate IS NULL THEN GETDATE() ELSE MT2.bdate END 
    FROM MainTable AS MT 
    LEFT JOIN (
       SELECT 
         ID 
         ,bdate = MAX(bdate) 
        FROM MainTable 
        GROUP BY ID 
       ) MT2 
     ON MT2.ID = MT.ID 
     AND MT2.bdate = MT.bdate 

Теперь я думаю, эта логика должна быть очень близка к вашей таблице логики темп, кроме этого используется подзапрос (чтобы работать быстрее). Это также предполагает, что столбец «Item» не имеет отношения к вашим целям.

0

Test Data

DECLARE @t TABLE (ID INT,BDate VARCHAR(10),Item VARCHAR(10)) 
INSERT INTO @t 
VALUES 
(1,'20010101','1a'), 
(1,'20020202','1b'), 
(1,'20030303','1c'), 
(2,'20010101','1d'), 
(2,'20020202','1e') 

Запрос

;WITH MaxDates 
AS 
    (
    SELECT *, rn = RANK() OVER (PARTITION BY ID ORDER BY BDate DESC) 
    FROM @t 
) 
UPDATE MaxDates 
SET BDate = CONVERT(VARCHAR(8), GETDATE(), 112) 
FROM MaxDates 
WHERE rn > 1 

SELECT * 
FROM @t 

Результат Набор

╔════╦══════════╦══════╗ 
║ ID ║ BDate ║ Item ║ 
╠════╬══════════╬══════╣ 
║ 1 ║ 20140106 ║ 1a ║ 
║ 1 ║ 20140106 ║ 1b ║ 
║ 1 ║ 20030303 ║ 1c ║ 
║ 2 ║ 20140106 ║ 1d ║ 
║ 2 ║ 20020202 ║ 1e ║ 
╚════╩══════════╩══════╝ 
Смежные вопросы