процентиль по COUNT (DISTINCT) с коррелированным WHERE работает только с представлением (или без DISTINCT)
У меня есть странный, и я не знаю, мой ли это синтаксис (который кажется простым) или ошибка (или просто не поддерживается).
Вот мой запрос, который работает, но излишне медленный:
UPDATE table1
SET table1column1 =
(SELECT COUNT(DISTINCT table2column1) FROM table2view WHERE table2column1 <= (SELECT table2column1 FROM table2 WHERE table2.id = table1.id) )
/
(SELECT COUNT(DISTINCT table2column1) FROM table2)
+ (SELECT COUNT(DISTINCT table2column2) FROM table2view WHERE table2column2 <= (SELECT table2column2 FROM table2 WHERE table2.id = table1.id) )
/
(SELECT COUNT(DISTINCT table2column2) FROM table2)
+ (SELECT COUNT(DISTINCT table2column3) FROM table2view WHERE table2column3 <= (SELECT table2column3 FROM table2 WHERE table2.id = table1.id) )
/ (SELECT COUNT(DISTINCT table2column3) FROM table2);
Это просто сумма трех процентилей (table2column1, table2column2 и table2column3) с удаленными дубликатами.
Вот где это становится странным. Я должен использовать представление для этого, чтобы работать над подзапросом сWHERE
или это будет толькоUPDATE
первый рядtable1
и установить остальные строкиtable1column1
в0
, Этоtable2view
точная копияtable2
, Да странно
Если я не используюDISTINCT
Я могу сделать это без зрения. Имеет ли это смысл?Примечание: я должен иметьDISTINCT
потому что у меня много дубликатов.
Я пытался сделать этоSELECT
только с точки зрения, но это замедлило это хуже.
Кто-нибудь знает, в чем проблема и лучший способ переработать этот запрос, чтобы он не занял так много времени? Это вTRIGGER
и обновленные данные довольно по требованию.
Спасибо заранее!
подробности
Я проверяю скорость в командной строке phpMyAdmin.
Я почти уверен, что ухудшение происходит от представления, поскольку чем больше представление и чем меньше используемой таблицы, тем медленнее она получается.
Когда я делаю один безDISTINCT
Молниеносно.
Работает только на просмотры?
ОК, так что я просто создал копиюtable2
, Сначала я попытался выполнить исходный запрос, заменив представление копией. Нет идти
Я попытался сделать запрос ниже с копией вместо представления. Нет идти
Надеюсь, введение этих констант лучше покажет, что я пытаюсь сделать.
SET @table2column1_distinct_count = (SELECT COUNT(DISTINCT table2column1) FROM table2);
SET @table2column2_distinct_count = (SELECT COUNT(DISTINCT table2column2) FROM table2);
SET @table2column3_distinct_count = (SELECT COUNT(DISTINCT table2column3) FROM table2);
UPDATE table1, table2
SET table1.table1column1 = (SELECT COUNT(DISTINCT table2column1) FROM table2view WHERE table2column1 <= table2.table2column1) / @table2column1_distinct_count
+ (SELECT COUNT(DISTINCT table2column2) FROM table2view WHERE table2column2 <= table2.table2column2) / @table2column2_distinct_count
+ (SELECT COUNT(DISTINCT table2column3) FROM table2view WHERE table2column3 <= table2.table2column3) / @table2column3_distinct_count
WHERE table1.id = table2.id;
Опять же, когда я используюtable2
вместоtable2view
, он только корректно обновляет первую строку и устанавливает все остальные строки table1.table1column1 =0
.
математический
Я пытаюсь установитьtable1.table1column1
= к сумме процентилейtable2column1
, table2column2
, а такжеtable2column3
поid
.
Я делаю процентиль (считая различные значенияtable2columnX
<= к текущемуtable2columnX
) / (общее количество различныхtable2columnX
с).
я используюDISTINCT
избавиться от лишних дубликатов.
Посмотреть
ВотSELECT
для просмотра. Это помогает?
CREATE VIEW myTable.table2view AS SELECT
table2.table2column1 AS table2column1,
table2.table2column2 AS table2column2,
table2.table2column2 AS table2column3,
FROM table2
GROUP BY table2.id;
Есть ли что-то особенное вGROUP BY
в представленииSELECT
что делает эту работу (что я не вижу)?