SQL - 从两列分组中选择顶部项

时间:2017-01-06 16:03:16

标签: sql sql-server

我有一个数字列表附加到两个单独的列,我想只返回两列的第一个“匹配”来获取该数据。我接近this回答,但它只适用于一个字段。我需要它来处理字段的组合。在我准备发布之前大约十秒钟。

这是一个示例表“Item”:

Item    Color     Area
Boat    Red       1
Boat    Red       2
Boat    Blue      4
Boat    Blue      5
Car     Red       3
Car     Red       4
Car     Blue      10
Car     Blue      31

返回的结果集应为:

Item    Color     Area
Boat    Red       1
Boat    Blue      4
Car     Red       3
Car     Blue      10

4 个答案:

答案 0 :(得分:2)

更简单的方法:

select Item,
    Color,
    min(Area) as Area
from Item
group by Item
    Color

答案 1 :(得分:2)

只需将MIN功能与GROUP BY一起使用。

SELECT Item, Color, MIN(area) AS Area
FROM Item
GROUP BY Item, Color

输出:

Item    Color   Area
Boat    Blue    4
Boat    Red     1
Car     Blue    10
Car     Red     3

SQL小提琴:http://sqlfiddle.com/#!9/46a154/1/0

答案 2 :(得分:1)

SQL表代表无序集。因此,如果没有指定排序的列,则没有任何“第一”。

对于您的示例结果,最简单的查询是:

select item, color, min(area) as area
from item i
group by item, color;

答案 3 :(得分:0)

在我准备发布问题之前大约十秒钟,我意识到了答案:

WITH summary AS (
SELECT i.item + ':' + i.color,             
       a.area, 
       ROW_NUMBER() OVER(PARTITION BY i.item + ':' + i.color, 
                             ORDER BY i.item + ':' + i.color DESC) AS rk
  FROM Item i
  group by (i.item + ':' + i.color, i.Area)

SELECT s。*   来自摘要  在哪里s.rk = 1

就像将两个复合关键字段组合成一个字段并基于该字段进行分组一样简单。这可能有点hackish所以如果有人想建议一个更好的选择,我就是为了它。