Как вы можете видеть из моего запроса ниже, я обновляю столбцы percenting_pages
и percentile_visits
для компании 1.
UPDATE mytable
SET percentile_pages = CASE
WHEN pages >= 1
AND pages < 2 THEN 25
WHEN pages >= 2
AND pages < 3 THEN 35
WHEN pages >= 3
AND pages < 5 THEN 40
WHEN pages >= 5 THEN 45
ELSE percentile_pages
END,
percentile_visits = CASE
WHEN visits >= 2
AND visits < 3 THEN 25
WHEN visits >= 3
AND visits < 4 THEN 35
WHEN visits >= 4
AND visits < 6 THEN 40
WHEN visits >= 6 THEN 45
ELSE percentile_visits
END
WHERE company = 1
После этого в дополнительных этих двух столбцах (percentile_visits
и percentile_pages
) я буду использовать эти 2 столбца для обновления столбца total_percentile
.
То, что я хочу сделать, заключается в том, чтобы избежать обновления percentile_visits
и percentile_pages
и вместо этого обновлять только 1 столбец total_percentile
.
Это, конечно, позволит мне оптимизировать мое приложение. Есть ли способ редактировать запрос, вместо того, чтобы обновлять столбцы, суммировать каждое "значение"?
Вы можете добавить значения таким образом
Если вам нужно только total_percentile и для этого вашего ИЗВЛЕКИТЕ колонны percentile_pages
и percentile_visits
, то вы можете изменить один из этого столбца в другом с total_percentile
и установите 0 для второго
UPDATE mytable
SET
total_percentile = (CASE
WHEN pages >= 1
AND pages < 2 THEN 25
WHEN pages >= 2
AND pages < 3 THEN 35
WHEN pages >= 3
AND pages < 5 THEN 40
WHEN pages >= 5 THEN 45
ELSE total_percentile
END) +
( CASE
WHEN visits >= 2
AND visits < 3 THEN 25
WHEN visits >= 3
AND visits < 4 THEN 35
WHEN visits >= 4
AND visits < 6 THEN 40
WHEN visits >= 6 THEN 45
ELSE 0
END)
WHERE company = 1
или если вам нужно обновить все 3 столбца
UPDATE mytable
SET percentile_pages = CASE
WHEN pages >= 1
AND pages < 2 THEN 25
WHEN pages >= 2
AND pages < 3 THEN 35
WHEN pages >= 3
AND pages < 5 THEN 40
WHEN pages >= 5 THEN 45
ELSE percentile_pages
END,
percentile_visits = CASE
WHEN visits >= 2
AND visits < 3 THEN 25
WHEN visits >= 3
AND visits < 4 THEN 35
WHEN visits >= 4
AND visits < 6 THEN 40
WHEN visits >= 6 THEN 45
ELSE percentile_visits
END,
total_percentile = (CASE
WHEN pages >= 1
AND pages < 2 THEN 25
WHEN pages >= 2
AND pages < 3 THEN 35
WHEN pages >= 3
AND pages < 5 THEN 40
WHEN pages >= 5 THEN 45
ELSE percentile_pages
END) +
( CASE
WHEN visits >= 2
AND visits < 3 THEN 25
WHEN visits >= 3
AND visits < 4 THEN 35
WHEN visits >= 4
AND visits < 6 THEN 40
WHEN visits >= 6 THEN 45
ELSE percentile_visits
END)
WHERE company = 1
ELSE percentile_pages
и ELSE percentile_visits
?
Вы говорите, что хотите обновить столбец. Поэтому я предполагаю, что с помощью "СУММ" вы не имеете в виду совокупную функцию SUM()
но равную сумму, иначе вы бы обновляли значение строки (возможно, для компании = ID_ALL?).
Если мое предположение верно, вы можете просто сказать
UPDATE mytable
SET total_percentile = CASE ... ELSE 0 END + CASE ... ELSE 1 END
WHERE (visits > 1 OR pages > 0) [ AND company = 1 ]
Два CASE файла - это тот, который вы уже используете, за исключением того, что ELSE был заменен на 0. Это создает пограничный случай, когда страницы = 1 и посещения = 0, но я ожидаю, что это будет маловероятным.
Запрос будет работать для одной компании или для любого их выбора.
Ваша "оптимизация" кажется довольно бессмысленной. Большая часть времени, затрачиваемого на обновление, включает в себя регистрацию и изменение данных, а не установку отдельных столбцов. Обновление трех столбцов в строке имеет точно такие же накладные расходы, что и обновление одного столбца, поскольку вся строка является единицей.
Я могу предложить упрощение вашего кода. Это не оптимизация производительности, просто упрощение:
UPDATE mytable
SET percentile_pages = (CASE WHEN pages >= 5 THEN 45
WHEN pages >= 3 THEN 40
WHEN pages >= 2 THEN 35
WHEN pages >= 1 THEN 25
ELSE percentile_pages
END),
percentile_visits = (CASE WHEN visits >= 6 THEN 45
WHEN visits >= 4 THEN 40
WHEN visits >= 3 THEN 35
WHEN visits >= 2 THEN 25
ELSE percentile_visits
END),
total_percentile = (CASE WHEN pages >= 5 THEN 45
WHEN pages >= 3 THEN 40
WHEN pages >= 2 THEN 35
WHEN pages >= 1 THEN 25
ELSE percentile_pages
END) +
(CASE WHEN visits >= 6 THEN 45
WHEN visits >= 4 THEN 40
WHEN visits >= 3 THEN 35
WHEN visits >= 2 THEN 25
ELSE percentile_visits
END)
WHERE company = 1 AND (visits >= 2 OR pages >= 1);
Одна из важных причин, почему просто обновление total_percentile
не будет делать то, что вы хотите, для следующего обновления. В случае, если visits
или pages
не изменяются, вам нужно иметь предыдущее значение percentile_pages
и percentile_visits
.
В любом случае нет реального выигрыша в производительности от того, что вы не обновляете отдельные значения.