3

同じ古い質問:

私はテーブルを持っています。フィールドのセットでグループ化された、フィールドの最大値を持つ行が必要です。しかし、最大値とフィールドごとのグループだけは必要ありません。行全体が必要です(他のすべてのフィールドなので、次のことはできません:

select max(field1),  field2 from table group by field2; 

先ほど言ったように、field3、field4、...、fieldn が必要です。

これは以前に扱われたことがあり、ここで優れた答えを見つけました:

SQL は、列に最大値を持つ行のみを選択します

基本的に、そこからすべてのフィールドを取得して元のテーブルと、最大値とグループ化フィールドを取得するサブクエリの間で結合を行う必要があると書かれています。そして、ほとんどの場合、それはおそらく機能します。

私の問題

私の特定のケースでは、データ型が関係しているため、そのアプローチが機能するかどうかはわかりません。例を挙げましょう。

これにより、必要なフィールドごとにグループ化された、必要な最大値が得られると考えてください。

select max(field1) maxf1, field2 f2 from mytable group by f2

上記のリンクは、次のようなものを試すことを提案します:

SELECT mt.field1, mt.field2, mt.field3, ... , mt.fieldn
FROM mytable mt
INNER JOIN (
    SELECT max(field1) maxf1, field2 f2 FROM mytable GROUP BY f2
) sq
ON sq.maxf1 = mt.field1 AND sq.f2 = mt.field2

私の特定のケースでは、field1 と field2 は FLOAT と TIMESTAMP 型である可能性があります。したがって、join の比較は適切ではない可能性があります (float と double の比較に最も効果的な方法は何ですか? を参照してsq.maxf1 = mt.field1ください)。それで、これに関する私へのヒントはありますか?sq.f2 = mt.field2

4

1 に答える 1

3

あなたのクエリは問題ありません:

SELECT mt.field1, mt.field2, mt.field3, ... , mt.fieldn
FROM mytable mt
INNER JOIN ( SELECT max(field1) maxf1, field2 f2 
             FROM mytable GROUP BY f2
           ) sq
   ON sq.maxf1 = mt.field1 
     AND sq.f2 = mt.field2

MAX()またはMIN()、懸念される他の計算を集計または実行しているが、とにかくフィールドを使用していない場合、浮動丸めの問題は発生しませJOINん。

参考までに: 他の変換を行っていた場合、または一方に を使用し、もう一方にをJOIN使用しようとしている場合、一般的な方法は、許容可能な誤差範囲を選択し、絶対値と減算を使用することです。FLOATDECIMAL

SELECT mt.field1, mt.field2, mt.field3, ... , mt.fieldn
FROM mytable mt
INNER JOIN ( SELECT max(field1) maxf1, field2 f2 
             FROM mytable GROUP BY f2
           ) sq
   ON ABS(sq.maxf1 - mt.field1) < .0001
     AND sq.f2 = mt.field2
于 2013-09-24T19:58:50.880 に答える