2016-08-24 89 views
0

預測列我有一個PostgreSQL數據庫這樣計算實際之間的第95百分位數差和在SQL

的表和相應列的數據類型是

讀數

meas_id - integer(Foreign keyed to Measurement.meas_id) 
actual_meas - integer 
predicted_meas - integer 
pdatetime - Timestamp with timezone (UTC) 
status - Enum('completed', 'inprogress', 'nottaken') 

測量

meas_id - integer 
meas_name - string 

Meas_name has measurements length, breadth, width, height 

對於每個測量「長度」和「寬度」,我試圖計算過去30天內所有已完成測量的實際值和預測值之間的第95百分位差。

我試圖做這種方式,但沒有得到它

SELECT 
Measurement.meas_name, 
MIN(Readings.actual_meas - Readings.predicted_meas) AS Difference 
FROM 
(
    SELECT TOP 95 PERCENT 
    FROM Readings 
    ORDER BY Difference DESC 
) AS NinetyFivePerc 
JOIN Measurement 
WHERE NinetyFivePerc.meas_id = Measurement.meas_id 
AND NinetyFivePerc.pdatetime >= DATEADD(DAY, -30, GETDATE()) 
AND Measurement.meas_name IN ('length','breadth') 
AND NinetyFivePerc.status = 'completed' 

我學習SQL等請提供上實現它以優化的方式輸入。

回答

1

Postgres具有percentile_disc()percentile_cont()聚合函數。

所以,你可以這樣做:

SELECT m.meas_name, 
     PERCENTILE_CONT(0.05) WITHIN GROUP (ORDER BY r.actual_meas - r.predicted_meas), 
     PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY r.actual_meas - r.predicted_meas) 
FROM Readings r JOIN 
    measurements m 
    ON r.meas_id = m.meas_id 
WHERE m.meas_name IN ('length', 'breadth') AND 
     r.status = 'completed' 
GROUP BY m.meas_name;