0

下位集計を使用してサブクエリでグループ化しようとしています(これは最も基本的なフォームであるgroup by nというクエリに簡略化されています)。 0-2からGROUP BYカスタム集計

bar範囲:

しかし、その代わりに、最大を使用しての、私は今、次のヒューリスティックが必要です。私はその順序で2,0,1から選びたいと思う。しかし、私は元のオリジナルのの値にbarの値で参加したいと思います。

適切なプロパティを返すカスタム集計関数を記述できますか?私は2つがどのように組み合わされるのか少し失われています。

SELECT 
    FOO.bar2 
FROM 
    FOO 
INNER JOIN(
    SELECT 
     FOO.id, 
     custom_aggrgate(bar) 
    FROM 
     FOO      
    GROUP BY 
     FOO.id    
    ) b ON FOO.bar = inverse_of_custom_aggrgate(bar) -- get org. value of bar to join by 
+1

入力値の例と、探している出力を提供できますか。 – Alex

答えて

1

最も簡単なソリューションはDISTINCT ONとなりますし、ORDER BYCASEの式:

は、私は、これはあなたが実際にを望むものであると仮定します。

SELECT DISTINCT ON (id) bar2 
FROM foo 
ORDER BY id, CASE bar WHEN 2 THEN -1 ELSE bar END; 

カスタム集計機能の必要はありません。
別の結合の必要はありません。
上記のカスタム集計関数の結果を逆変換する関数は必要ありません。

についてDISTINCT ON


問題でクエリが何をしたい構文的に無効であり、おそらくありません。固定された構文では、次のようになります。

SELECT FOO.bar2 
FROM FOO 
INNER JOIN (
    SELECT FOO.id, custom_aggrgate(bar) AS bar 
    FROM FOO      
    GROUP BY FOO.id    
    ) b ON FOO.bar = inverse_of_custom_aggrgate(b.bar);

これはおそらくナンセンスでしょう。 barが一意に定義されていない場合(シナリオではそうは思われません)、重複する行がたくさんあります。この疑わしいクエリに相当するのは次のようなものです:

SELECT f.bar2 
FROM foo f 
JOIN (
    SELECT DISTINCT ON (id) bar 
    FROM foo 
    ORDER BY id, CASE bar WHEN 2 THEN -1 ELSE bar END 
    ) b USING (bar); 

私はあなたが必要とするものではありません。