-1

私はこのデータセットを持っています:

|  ID | TYPE | PERCENT |
------|------|---------|
| 123 |    A |     0.5 |
| 123 |    B |     0.5 |
| 456 |    A |     0.7 |
| 456 |    B |     0.3 |
| 789 |    A |       1 |

次の結果が欲しいです。

|  ID | TYPE | PERCENT |
------|------|---------|
| 123 |    A |     0.5 |
| 456 |    A |     0.7 |
| 789 |    A |       1 |

つまり、MAX(percent)for eachidと対応するを取得しtypeます。

私は現在使用しています

SELECT ... 
FROM
  (SELECT [id], MAX([percent]) AS [p]
  FROM [highest]
  GROUP BY [id]) a
LEFT JOIN [highest] b 
  ON b.[id] = a.[id]
    AND b.[percent] = a.[p]

そして取得

|  ID |   P | TYPE | PERCENT |
--- --|-----|------|---------|
| 123 | 0.5 |    A |     0.5 |
| 123 | 0.5 |    B |     0.5 |
| 456 | 0.7 |    A |     0.7 |
| 789 |   1 |    A |       1 |
4

2 に答える 2

3

このクエリを試してください:

SELECT  src.[id], src.[type], src.[percent]
FROM (
    SELECT  [id], [type], [percent], 
            ROW_NUMBER() OVER(PARTITION BY h.[id] ORDER BY [percent] DESC, h.[type] ASC) AS RowNum
    FROM    [highest] h
) src
WHERE src.RowNum = 1
于 2013-09-23T18:48:13.657 に答える
1

猫の皮を剥ぐ別の方法:

SELECT d.ID, m.type, m.[percent]
FROM highest AS d
CROSS APPLY (
  SELECT TOP 1 type, [percent]
  FROM highest
  WHERE ID = d.ID
  ORDER BY [percent] DESC, type ASC
) AS m
GROUP BY d.ID, m.type, m.[percent]
;

つまり、すべての distinctIDについて、最大 ( TOP 1 ... ORDER BY [percent] DESC)の行percentがフェッチされます。複数の種類で同一IDの最大値が存在する場合は、ソート順が最も早いもの( type ASC)が選択されます。

少し冗長な等価物 (GROUP BY の代わりに DISTINCT を使用):

SELECT DISTINCT d.ID, m.type, m.[percent]
FROM highest AS d
CROSS APPLY (
  SELECT TOP 1 type, [percent]
  FROM highest
  WHERE ID = d.ID
  ORDER BY [percent] DESC, type ASC
) AS m
;

適切な索引付けがあれば、 @Bogdan Sahlean の提案よりも悪くはないはずです。

于 2013-09-24T06:20:31.473 に答える