SQL обновляет все, кроме одной записи в группе - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть таблица, подобная этой:

|f_key1|f_key_2|bool_value|updated_at|

Я хочу написать SQL-запрос, который получает каждую запись, в которой значение bool_value равно true, и группирует по f_key1, а f_key2 устанавливает bool_value в false. Другими словами, к концу запроса должна быть только одна запись для каждой пары из двух ключей, где bool_value равно true, а остальные установлены в false. Точная запись, которая остается истинной, не имеет значения, но если это необходимо, можно отсортировать updated_at и выбрать самое последнее значение.

Пример данных

|f_key1|f_key_2|bool_value|updated_at|
|1     |2      | true     | date     |
|1     |2      | true     | date     |
|4     |2      | true     | date     |

Вывод

|f_key1|f_key_2|bool_value|updated_at|
|1     |2      | true     | date     |
|1     |2      | false    | date     |
|4     |2      | true     | date     |

Как этого добиться совместимым с Microsoft SQL Server?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Использование обновляемого CTE:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY f_key1, f_key_2 ORDER BY updated_at DESC) rn
    FROM yourTable
    WHERE bool_value = 1
)

UPDATE cte
SET bool_value = 0
WHERE rn > 1;

При таком подходе самая последняя запись в группе будет оставаться с bool_value, установленным в true.

0 голосов
/ 07 ноября 2019
update  x1
set     
    bool_value = 1

from    table x1

inner join 
        (
            select  f_key1, f_key2, max_updated_at = max(updated_at)
            from    table x2
            group by 
                    f_key1, 
                    f_key2
        ) x2
on      x1.f_key1 = x2._fkey1
        x1.f_key2 = x2.f_key2
and     x1.updated_at = x2.max_updated_at

Вот, пожалуйста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...