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. Oracleには、2つの日付の差を計算する関数がありますか?

    2. null許容列にPRIMARYKEYを使用してテーブルを作成できるのはなぜですか?

    3. OracleデータベースでPL/SQLパッケージを作成する方法

    4. 更新時に変更のないタイムスタンプ