percentyl według COUNT (DISTINCT) ze skorelowanym WHERE działa tylko z widokiem (lub bez DISTINCT)

Mam dziwną i nie wiem, czy to moja składnia (która wydaje się prosta), czy błąd (lub po prostu nieobsługiwany).

Oto moje zapytanie, które działa, ale jest niepotrzebnie powolne:

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);

Jest to tylko suma trzech percentyli (z table2column1, table2column2 i table2column3) z usuniętymi duplikatami.

Oto, gdzie robi się dziwnie. Muszę użyć widoku, aby pracować z podzapytaniem za pomocąWHERE lub będzie tylkoUPDATE pierwszy rządtable1i ustaw resztę rzędów ”table1column1 do0. Żetable2view jest dokładnym duplikatemtable2. Tak, dziwne.

Jeśli nie użyjęDISTINCT, Mogę to zrobić bez widoku. Czy to ma sens?Uwaga: musze miećDISTINCT ponieważ mam dużo duplikatów.

Próbowałem to zrobićSELECT tylko z widoku, ale to go spowolniło.

Czy ktoś wie, jaki jest problem i jak najlepiej przerobić to zapytanie, aby nie trwało to tak długo? Jest wTRIGGER, a zaktualizowane dane są dość na żądanie.

Z góry bardzo dziękuję!

Detale

Testuję szybkość w linii poleceń phpMyAdmina.

Jestem pewien, że degradacja pochodzi z widoku, ponieważ im więcej widoku i mniej rzeczywistego stołu używam, tym wolniej się robi.

Kiedy robię to bezDISTINCT, to błyskawicznie.

Działa tylko na widokach?

OK, więc po prostu skonfigurowałem kopiętable2. Próbowałem najpierw wykonać oryginalne zapytanie zastępujące widok kopią. Nie idź.

Próbowałem wykonać zapytanie poniżej z kopią zamiast z widokiem. Nie idź.

Mam nadzieję, że wprowadzenie tych stałych lepiej pokaże, co próbuję zrobić.

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;

Znowu, kiedy używamtable2 zamiast tegotable2view, aktualizuje tylko pierwszy wiersz poprawnie i ustawia wszystkie inne wiersze 'table1.table1column1 =0.

Matematyka

Próbuję to ustawićtable1.table1column1 = do sumy percentylitable2column1, table2column2, itable2column3 przezid.

Robię percentyl przez (licząc różne wartości atable2columnX <= do prądutable2columnX ) / (całkowita liczba odrębnychtable2columnXs).

używamDISTINCT pozbyć się nadmiernych duplikatów.

Widok

Tutaj jestSELECT dla widoku. czy to pomaga?

CREATE VIEW myTable.table2view AS SELECT
    table2.table2column1 AS table2column1,
    table2.table2column2 AS table2column2,
    table2.table2column2 AS table2column3,
FROM table2
GROUP BY table2.id;

Czy jest coś specjalnego w tymGROUP BY w widokuSELECT to sprawia, że ​​ta praca (której nie widzę)?

questionAnswers(1)

yourAnswerToTheQuestion