6

(列 A) でグループ化する集計関数があります。一連の列 (列 B) から最大値を選択しますが、同じ行 (列 C) の列から別の値を返したいと考えています。ただし、3 つの行をグループ化すると、最大 (MAX(col B)) の列ではなく、列 C から最初の値が選択されます。

A    B    C
1     75  jkl
1    100  abc
1    125  dae
2    200  def
3    300  ghi

"SELECT A, MAX(B), C FROM myTable where B > 50 GROUP BY A"

returns (first row) A => 1, B => 125, C => jkl

I want it to return 

A => 1, B => 125, C => dae
4

3 に答える 3

14

max(b)by eachを取得し、Aその値をテーブルに結合して、サブクエリの値に一致する残りの列を返すサブクエリを使用する必要があります。

select *
from mytable t1
inner join
(
  select A, max(b) B
  from mytable
  where b >50
  group by a
) t2
  on t1.a = t2.a
  and t1.b = t2.b
where t1.b >50

デモで SQL Fiddle を参照してください

于 2013-02-14T17:16:39.017 に答える
5

使用しているRDBMSについて言及していないため、ほとんどすべてのRDBMSで機能するこのクエリを使用してください

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT  A, MAX(b) max_B
            FROM    tableName
            WHERE   b > 50
            GROUP   BY A
        ) b ON a.A = b.A   AND
            a.B = b.max_B

ただし、RDBMSがウィンドウ関数をサポートしている場合は、使用できますDENSE_RANK()

SELECT  A, B, C
FROM    
        (
            SELECT  A, B, C,
                    DENSE_RANK() OVER (PARTITION A ORDER BY B DESC) rn
            FROM    tableName
            WHERE   b > 50
            GROUP   BY      
        ) a
WHERE   rn = 1

于 2013-02-14T17:16:06.250 に答える
3

これは非常に一般的な問題です。「min()/max() 集計条件に一致する行の他の列を表示してください。」大規模なテーブルでは、サブクエリ戦略が非常に遅くなる可能性があり、ランク付け関数がそれほど優れていない場合があります。

理解したい場合は、これがこれを処理する最も効率的な方法です (繰り返しますが、最も読みやすいとは言えません)。

SELECT  A, cast(left(val, 8) as int) AS B, substring(val, 9, 999) AS C
FROM  ( SELECT A, max(str(B, 8) + C) AS val FROM myTable GROUP BY A) t

必要なものを何でも連結maxして、外側のクエリで抽出できます。出来上がり。

これは、bluefeet および JW によって投稿されたソリューションとは異なる結果を返すことに注意してください。グループごとに一致する最大値が複数ある場合、このメソッドは勝者 (最大の C) を選択しますが、他のメソッドは複数のレコードを返します。したがって、3 番目の B 値が 125 ではなく 100 の場合、これは1 , 100, daeを返しますが、他のソリューションは1, 100, abd1, 100, dae の両方を返します。

于 2013-02-14T17:51:35.273 に答える