Mysql
 sql >> база данни >  >> RDS >> Mysql

процентил по COUNT(DISTINCT) с корелиран WHERE работи само с изглед (или без DISTINCT)

Вероятно бих казал, че заявката е бавна, защото многократно осъществява достъп до таблицата при задействане на тригера.

Не съм експерт по SQL, но се опитах да събера заявка с помощта на временни таблици. Можете да видите дали това помага за ускоряване на заявката. Използвах различни, но подобни звучащи имена на колони в моя примерен код по-долу.

РЕДАКТИРАНЕ: Имаше грешка при изчисление в предишния ми код. Актуализирано сега.

SELECT COUNT(id) INTO @no_of_attempts from tb2;

-- DROP TABLE IF EXISTS S1Percentiles;
-- DROP TABLE IF EXISTS S2Percentiles;
-- DROP TABLE IF EXISTS S3Percentiles;

CREATE TEMPORARY TABLE S1Percentiles (
    s1 FLOAT NOT NULL,
    percentile FLOAT NOT NULL DEFAULT 0.00
);

CREATE TEMPORARY TABLE S2Percentiles (
    s2 FLOAT NOT NULL,
    percentile FLOAT NOT NULL DEFAULT 0.00
);

CREATE TEMPORARY TABLE S3Percentiles (
    s3 FLOAT NOT NULL,
    percentile FLOAT NOT NULL DEFAULT 0.00
);



INSERT INTO S1Percentiles (s1, percentile)
    SELECT A.s1, ((COUNT(B.s1)/@no_of_attempts)*100)
    FROM (SELECT DISTINCT s1 from tb2) A
    INNER JOIN tb2 B
    ON B.s1 <= A.s1
    GROUP BY A.s1;

INSERT INTO S2Percentiles (s2, percentile)
    SELECT A.s2, ((COUNT(B.s2)/@no_of_attempts)*100)
    FROM (SELECT DISTINCT s2 from tb2) A
    INNER JOIN tb2 B
    ON B.s2 <= A.s2
    GROUP BY A.s2;

INSERT INTO S3Percentiles (s3, percentile)
    SELECT A.s3, ((COUNT(B.s3)/@no_of_attempts)*100)
    FROM (SELECT DISTINCT s3 from tb2) A
    INNER JOIN tb2 B
    ON B.s3 <= A.s3
    GROUP BY A.s3;

-- select * from S1Percentiles;
-- select * from S2Percentiles;
-- select * from S3Percentiles;

UPDATE tb1 A
    INNER JOIN
    (
    SELECT B.tb1_id AS id, (C.percentile + D.percentile + E.percentile) AS sum FROM tb2 B
        INNER JOIN S1Percentiles C
        ON B.s1 = C.s1
        INNER JOIN S2Percentiles D
        ON B.s2 = D.s2
        INNER JOIN S3Percentiles E
        ON B.s3 = E.s3
    ) F
    ON A.id = F.id

    SET A.sum = F.sum;

-- SELECT * FROM tb1;

DROP TABLE S1Percentiles;
DROP TABLE S2Percentiles;
DROP TABLE S3Percentiles;

Това, което прави това, е, че записва процентила за всяка група резултат и накрая просто актуализира tb1 колона с необходимите данни, вместо да се преизчислява процентилът за всеки ред на ученика.

Трябва също да индексирате колони s1 , s2 и s3 за оптимизиране на заявките в тези колони.

Забележка:Моля, актуализирайте имената на колоните според вашата db схема. Също така имайте предвид, че всяко изчисление на процентил е умножено по 100 тъй като вярвам, че процентилът обикновено се изчислява по този начин.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как избирате всеки n-ти ред от mysql

  2. sql ако в инструкция за вмъкване без select

  3. CHAR() или VARCHAR() като първичен ключ в ISAM MySQL таблица?

  4. Репликация от MySQL към MS SQL

  5. Как да спрем някой да се върне към предишната страница?