Как установить новый столбец в таблице на основе ранга других столбцов? - PullRequest
0 голосов
/ 10 июля 2020

У меня есть таблица Microsoft SQL Server, в которой есть два столбца - один для местоположений и один для связанных изображений . До сих пор, несколько изображений могли быть связаны с одним и тем же местом, и только последнее загруженное изображение фактически использовалось на мобильном сайте. Это было достигнуто путем присвоения ImageRank каждой строке:

RANK() OVER (PARTITION BY Location ORDER BY Image DESC) ImageRank

, так что только строки с ImageRank = 1 были выбраны процессом SSIS, который имел дело с мобильным сайтом:

Теперь мы хотим иметь возможность выбрать , какое из существующих изображений (а не только последнее) для отображения. Для этого мы ввели третий столбец - MobileSelection типа bit. Поскольку этот столбец был введен поздно, он имеет пустые значения для всех существующих строк.

Итак, у меня есть что-то вроде этого:

+-------+----------+-----------------+-----------+
| image | location | MobileSelection | ImageRank |
+-------+----------+-----------------+-----------+
|   850 |       10 |         NULL    |         1 |
|   209 |       10 |         NULL    |         2 |
+-------+----------+-----------------+-----------+

И я хочу установить только строку с ImageRank равным 1 до 1. Имейте в виду, что ImageRank не является фактическим столбцом, иначе это было бы тривиально.

Моя цель - иметь возможность написать оператор обновления, который присвоил бы этому столбцу значение 1, если строка is on имеет рассчитанный ImageRank, равный 1. Проблема, с которой я сталкиваюсь, заключается в том, что я могу объединить предложение Rank Over Partition (или что-то подобное) с оператором Update:

UPDATE dining_location SET MobileSelection = 1 WHERE RANK() OVER (PARTITION BY Location ORDER BY Image DESC) = 1;

Приведенное выше возвращает эту ошибку:

Оконные функции могут появляться только в предложениях SELECT или ORDER BY.

Я был бы признателен за любую помощь с этим. Спасибо!

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Требуется обновить mobileselection = 1 для последних изображений каждого местоположения.

Вы можете использовать ниже SQL -

UPDATE dining_location SET MobileSelection = 1 
WHERE image in (select t.image from 
(select location, image, RANK() OVER (PARTITION BY Location ORDER BY Image DESC) as rrank from dining_location) t where t.rrank = 1);
1 голос
/ 10 июля 2020

Используйте обновляемый CTE:

WITH toupdate as (
      SELECT dl.*, RANK() OVER (PARTITION BY Location ORDER BY Image DESC) as seqnum
      FROM dining_location dl
     )
UPDATE toupdate
    SET MobileSelection = 1
    WHERE seqnum = 1;
...