WITH W1 AS (
SELECT *
FROM tests
WHERE SN IN (
SELECT SN
FROM tests
GROUP BY SN
HAVING COUNT(SN) >= 5
)
),
W2_1 AS (
SELECT
ID, SN, T, M1, M2, M3,
CASE
WHEN M1 <= M2 AND M1 <= M3 THEN M1
WHEN M2 <= M1 AND M2 <= M3 THEN M2
ELSE M3
END AS LEAST,
CASE
WHEN M1 >= M2 AND M1 >= M3 THEN M1
WHEN M2 >= M1 AND M2 >= M3 THEN M2
ELSE M3
END AS GREATEST
FROM W1
),
W2_2 AS (
SELECT ID, SN, T, M1, M2, M3, LEAST, GREATEST
FROM W2_1
WHERE LEAST >= 0.9 * GREATEST
AND T >= 60
),
W3_1 AS (
SELECT ID, SN, T, M1, M2, M3, GREATEST, (M1 + M2 + M3)/3.0 AS AVG
FROM W2_2
),
W3_2 AS (
SELECT SN, MIN(AVG) AS MIN_AVG, MAX(AVG) AS MAX_AVG, GREATEST
FROM W3_1
GROUP BY SN
),
W4_1 AS (
SELECT
A.ID,
A.SN,
A.GREATEST AS MAX,
ROUND(A.AVG, 2) AS MAX_AVG
FROM W3_1 A
WHERE A.SN IN (
SELECT SN FROM W3_2
WHERE MIN_AVG >= 0.85*MAX_AVG
)
),
W4_2 AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY SN ORDER BY MAX_AVG DESC) AS RN
FROM W4_1
)
SELECT ID, SN, MAX, MAX_AVG
FROM W4_2
WHERE RN = 1
ORDER BY MAX_AVG DESC;
Jeśli jeszcze nie popełniłeś samobojstwa, proszę przeczytaj to.
ps. Czy napewno taki sigma?