Обновить столбец минимального значения выбранных строк - PullRequest
0 голосов
/ 08 марта 2020

Моя таблица -

## meters ##
meter_num--------reading1---------reading2-------reading3-------reading4
 123               12               14             15               10        
 345               14               15             16               19   

Для каждой строки я хочу обновить столбец с минимальным значением до заданного значения (скажем, ноль). Я знаю, используя функцию «LEAST», я могу получить минимальное значение среди столбцов. Но как мне обновить этот столбец с минимальным значением? например, когда я выполняю -

SELECT 
LEAST(reading1, reading2, reading3, reading4)
 FROM meters
 WHERE meter_num = '123'

возвращает -

reading4
  10

, теперь я хочу обновить read4 на что-то другое. Как мне это сделать?

1 Ответ

1 голос
/ 08 марта 2020

Если нет дубликатов и ни одно из значений не равно NULL, вы можете использовать case выражения:

update meters
    set reading1 = (case when reading1 = least(reading1, reading2, reading3, reading4) then 0 else reading1 end),
        reading2 = (case when reading2 = least(reading1, reading2, reading3, reading4) then 0 else reading2 end),
        reading3 = (case when reading3 = least(reading1, reading2, reading3, reading4) then 0 else reading3 end),
        reading4 = (case when reading4 = least(reading1, reading2, reading3, reading4) then 0 else reading4 end);

Примечание. Эта проблема была бы проще, если бы показания были в отдельных строки вместо отдельных столбцов .

Вы можете обрабатывать дубликаты с помощью твика:

update meters
    set reading1 = (case least(reading1, reading2, reading3, reading4)
                         when reading 1 then 0
                         else reading1
                   end),
        reading2 = (case least(reading1, reading2, reading3, reading4)
                         when reading1 then reading2
                         when reading2 then 0
                         else reading2
                    end),
        reading3 = (case least(reading1, reading2, reading3, reading4)
                         when reading1 then reading3
                         when reading2 then reading3
                         when reading3 then 0
                         else reading3
                    end),
       reading4 = (case least(reading1, reading2, reading3, reading4)
                         when reading1 then reading4
                         when reading2 then reading4
                         when reading3 then reading4
                         when reading4 then 0
                         else reading2
                    end),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...