Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

phân vị theo COUNT (DISTINCT) với WHERE tương quan chỉ hoạt động với một chế độ xem (hoặc không có DISTINCT)

Tôi có thể nói rằng truy vấn chậm vì nó đang truy cập liên tục vào bảng khi trình kích hoạt kích hoạt.

Tôi không phải là chuyên gia SQL nhưng tôi đã cố gắng tập hợp một truy vấn bằng cách sử dụng các bảng tạm thời. Bạn có thể xem liệu nó có giúp tăng tốc truy vấn hay không. Tôi đã sử dụng các tên cột khác nhau nhưng có âm giống nhau trong mẫu mã của tôi bên dưới.

CHỈNH SỬA: Đã xảy ra lỗi tính toán trong mã trước đó của tôi. Đã cập nhật ngay bây giờ.

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;

Điều này làm là nó ghi lại phân vị cho từng nhóm điểm và sau đó cuối cùng chỉ cập nhật tb1 cột với dữ liệu cần thiết thay vì tính toán lại phần trăm cho mỗi hàng sinh viên.

Bạn cũng nên lập chỉ mục các cột s1 , s2s3 để tối ưu hóa các truy vấn trên các cột này.

Lưu ý:Vui lòng cập nhật tên cột theo giản đồ db của bạn. Cũng lưu ý rằng mỗi phép tính phần trăm đã được nhân với 100 vì tôi tin rằng phần trăm thường được tính theo cách đó.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:SELECT sẽ kiểm tra nhiều hơn MAX_JOIN_SIZE hàng

  2. Nối nhiều cột từ một bảng thành một cột từ một bảng khác

  3. Lưu hình ảnh trong MySQL từ Java

  4. JSON_LENGTH () - Trả về độ dài của tài liệu JSON trong MySQL

  5. MyBatis enum sử dụng