2017-06-09 9 views
0

私は、my_tableから最も反復的な値を選択するクエリを持っています。クエリは以下の通りです:このクエリでの問題は、それがために間違った値を与えている降順で最も反復値を返すということですPostgreSQLでもっとも反復性の高い値を修正する方法

gid id max_height 
3 1 19.3 
3 2 19.3 
3 3 20.3 
3 4 20.3 
3 5 19.3 
3 6 19.3 
3 7 21.4 
3 8 21.4 
3 9 21.4 
3 10 21.4 
3 11 21.4 
3 12 21.4 
22 1 23.1 
22 2 23.1 
22 3 23.1 
22 4 23.1 
22 5 23.1 
22 6 23.1 
22 7 22.1 
22 8 22.1 
22 9 22.1 
22 10 22.1 
22 11 22.1 
22 12 22.1 
29 1 24 
29 2 24 
29 3 24 
29 4 18.9 
29 5 18.9 
29 6 18.9 
29 7 NULL 
29 8 NULL 
29 9 27.1 
29 10 27.1 
29 11 6.5 
29 12 6.5 

SELECT 
gid, 
    max_height 
    FROM 
    (
    SELECT gid, max_height, 
    ROW_NUMBER() OVER (PARTITION BY gid ORDER BY freq DESC) AS rn 
    FROM (
      SELECT gid, max_height, COUNT(id) AS freq 
      FROM my_table 
      GROUP BY 1, 2 
    order by 1,2 
    ) hgt_freq 
    ) ranked_hgt_req 
WHERE rn = 1 

しばらく、MY_TABLEのような3つの列が含まれていますGIDの場合は、クエリの= 22の出力である:GID = 22の場合について

gid max_height 
3  21.4 
22  22.1 
29  24.0 

、二つの最も反復値、すなわち、23.1および22.1があります。したがって、クエリは23.1を返します。誰も私にこの問題を解決する方法を教えてもらえますか、これを行うにはより良いアプローチがありますか?プロセスは大規模レコード(gid)の自動化が必要です。

答えて

2

使用distinct onthe documentation:

から

select distinct on(gid) gid, max_height 
from (
    select gid, max_height, count(id) as freq 
    from my_table 
    group by 1, 2 
    ) s 
order by gid, freq desc 

gid | max_height 
-----+------------ 
    3 |  21.4 
    22 |  23.1 
    29 |   24 
(3 rows) 

DISTINCT ON(式[、...])を選択し、所与の式がと評価行の各セットの最初の行のみを保持します等しい。 DISTINCT ON式は、ORDER BY(上記参照)と同じ規則を使用して解釈されます。各セットの「最初の行」は、ORDER BYを使用して目的の行が最初に表示されない限り、予測できないことに注意してください。


gid=29ための2つの最も頻度の高い値があります。あなたが選ぶことができる。このようなケースではそのために、彼らはorder byに1つの以上の条件を追加することによって、提示する必要があります。

select distinct on(gid) gid, max_height 
from (
    select gid, max_height, count(id) as freq 
    from my_table 
    group by 1, 2 
    ) s 
order by gid, freq desc, max_height desc; 

gid | max_height 
-----+------------ 
    3 |  21.4 
    22 |  23.1 
    29 |   24 
(3 rows)  

select distinct on(gid) gid, max_height 
from (
    select gid, max_height, count(id) as freq 
    from my_table 
    group by 1, 2 
    ) s 
order by gid, freq desc, max_height; 

gid | max_height 
-----+------------ 
    3 |  21.4 
    22 |  22.1 
    29 |  18.9 
(3 rows)  
+0

が、私はそれはあなたのケースではGID = 29、24を返したか疑問。私のために、それは18.9を返しました。私はgid 3、22、29のmax_heights 21.4、23.1、18.9を得ました。私は困惑しています。どんなアイデアなんだろう? –

+0

これは、 'max_height'の順序が未定義であるためです。修正された答えを見てください。 – klin

+0

はい、うまくいきました!ありがとうございました。 –

関連する問題