各グループの最大値を選択


87
Name    Value   AnotherColumn
-----------
Pump 1  8000.0  Something1
Pump 1  10000.0 Something2
Pump 1  10000.0 Something3
Pump 2  3043    Something4
Pump 2  4594    Something5
Pump 2  6165    Something6

私のテーブルはこのようなものです。各ポンプの最大値を選択する方法を教えてください。

select a.name, value from out_pumptable as a,
(select name, max(value) as value from out_pumptable where group by posnumber)g where and g.value = value

このコードは機能しますが、同じ値を持つ2つのエントリがあるため、Pump 1の2つのエントリを取得します。

回答:


182
select name, max(value)
from out_pumptable
group by name

36
しかし、これはstrictを使用するPostgresまたはその他のRDBMSでは機能しませんGROUP BY。厳密には、のGROUP BYすべての列がにSELECT表示されるかGROUP BY、集計関数で使用される必要があります。
NickAb 14

4
正しい。この文脈での「MySQLで動作」とは、基本的にクラッシュしないことを意味し、必ずしも正しい結果を返すわけではありません。
Craig

2
@Craigが間違っています。OPはグループごとの最大値でレコード全体を返した後ではなく、ポンプごとの最大値を求めていたため、このクエリはすべての種類のrdbmsで機能し、期待どおりにデータを返します。選択リストには、名前と値の2つのフィールドがあります。名前はgroup by句に含まれ、値はmaxを介して集約されます。選択リストにより多くのフィールドがあったはずの回答のバージョンを確認できません。
シャドウ

3
@クレイグそれデフォルトの動作ではありませんでした。ほぼ3年前のv5.7.5で変更されました。しかし、ここでも、要点を逃しています。この回答のコードはsql標準に準拠しているため、設定によるmysqlのグループは無関係です。
シャドウ

13
@NickAb私は何かが足りないのですか?すべての列、グループ化関数または集計関数のいずれかにあります
Rob

17
SELECT
  b.name,
  MAX(b.value) as MaxValue,
  MAX(b.Anothercolumn) as AnotherColumn
FROM out_pumptabl
INNER JOIN (SELECT 
              name,
              MAX(value) as MaxValue
            FROM out_pumptabl
            GROUP BY Name) a ON 
  a.name = b.name AND a.maxValue = b.value
GROUP BY b.Name

主キーがあれば、これははるかに簡単です。ここに例があります

SELECT * FROM out_pumptabl c
WHERE PK in 
    (SELECT
      MAX(PK) as MaxPK
    FROM out_pumptabl b
    INNER JOIN (SELECT 
                  name,
                  MAX(value) as MaxValue
                FROM out_pumptabl
                GROUP BY Name) a ON 
      a.name = b.name AND a.maxValue = b.value) 

ああ、ダング。例を単純化しすぎました。テーブルの列が多いため、少し複雑になっています。> <
Wai Wong

列がさらにある場合は、それらを選択に追加するだけ
m.edmondson

コラムについて詳しく教えてください。何をグループ化しようとしていますか?
ジョンハートソック2010

@Wai Wrong別の列を追加したようですが、それをどうしたいのか説明する必要がありますか?その列から値を返しますか?名前とSomeOtherColumnでグループ化しますか?
ジョンハートソック

別の列を追加しました。各ポンプの最大値と、他の列から最大値の行にある値を取得したいと思います。混乱しすぎていますか?
Wai Wong

16
select name, value 
from( select name, value, ROW_NUMBER() OVER(PARTITION BY name ORDER BY value desc) as rn
from out_pumptable ) as a
where rn = 1

これは、私のケースで機能する唯一の例です。「登録」ごとに複数の値があります。私が必要なのは、各登録の最後の値、左外部結合です。で注文さid DESCれ、PARTITIONこのクエリをでラップLEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.idして完全に機能します。
lucasarruda

2
select Name, Value, AnotherColumn
from out_pumptable
where Value =
(
  select Max(Value)
  from out_pumptable as f where f.Name=out_pumptable.Name
)
group by Name, Value, AnotherColumn

このようにしてみてください。



-3
SELECT DISTINCT (t1.ProdId), t1.Quantity FROM Dummy t1 INNER JOIN
       (SELECT ProdId, MAX(Quantity) as MaxQuantity FROM Dummy GROUP BY ProdId) t2
    ON t1.ProdId = t2.ProdId
   AND t1.Quantity = t2.MaxQuantity
 ORDER BY t1.ProdId

これはあなたにアイデアを与えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.