web-dev-qa-db-ja.com

他の列がグループの最大値である列の値を選択します

2つの列(テーブルとID)を選択しようとしています。テーブルには、各IDの最大値とともに状態が表示されます。他のいくつかの例を試しましたが、何もうまくいかないようです。

元のデータ構造:

ID  state    value (FLOAT)
1   TX   921,294,481 
1   SC   21,417,296 
1   FL   1,378,132,290 
1   AL   132,556,895 
1   NC   288,176 
1   GA   1,270,986,631 
2   FL   551,374,452 
2   LA   236,645,530 
2   MS   2,524,536,050 
2   AL   4,128,682,333 
2   FL   1,503,991,028

したがって、結果のデータ構造は次のようになります。

ID  STATE (Max Value)
1   FL
2   AL

IDグループで最大の値を持つフロリダとアラバマ。

これについてはどんな助けも大歓迎です。私はSO answer here をすでに見つけましたが、答えを私のために働かせることができませんでした。

30
Richard Todd

SQL Server(およびウィンドウ機能を備えた他の製品)の場合:

SELECT *
FROM
(
   SELECT
     *,
     ROW_NUMBER() OVER (PARTITION BY ID ORDER BY value desc) as rn
   FROM
     UnnamedTable
) t
WHERE
   t.rn = 1
37

サブクエリを使用して、この結果を取得できます。

select t1.id, t1.[state] MaxValue
from yourtable t1
inner join
(
  select id, max(value) MaxVal
  from yourtable
  group by id
) t2
  on t1.id = t2.id
  and t1.value = t2.maxval
order by t1.id

SQL Fiddle Demoを使用

7
Taryn

valueが数値であるという仮定に基づく解決策:

SELECT
  [ID],
  [State],
  [Value]
FROM
(
  SELECT 
    [ID],
    [State],
    [Value],
    Rank() OVER (PARTITION BY [ID] ORDER BY [Value] DESC) AS [Rank]
  FROM [t1]
) AS [sub]
WHERE [sub].[Rank] = 1
ORDER BY
  [ID] ASC,
  [State] ASC

同じStateを持つ複数のIDが同じValueを持つ場合、それらはすべて同じRankを取得します。これは、一意の行番号を返すRow_Numberの使用とは異なりますが、順序は任意に選択されます。 (参照: SQL RANK()vs ROW_NUMBER()

7
Jacco