2016-08-24 12 views
0

の列を予測私が持っているデータ型である実際間の95パーセンタイルの差を計算し、SQL

読みこの

テーブル及び各列のようなPostgreSQLデータベース

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 

'length'と 'breadth'の測定ごとに、過去30日間に完了したすべての測定値の実測値と予測値の95パーセンタイル差を計算しようとしています。

私はこのようにそれをやろうとしているが、私はSQLを学ぶので、親切にそれを達成するための最適化された方法で入力を提供しています

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' 

それを取得しておりません。

答えて

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; 
関連する問題