SQL GROUPING在2个字段上获取最小值

时间:2015-03-03 15:17:04

标签: sql sql-server database sql-server-2008

我编写了复杂查询并获取如下所示的数据:

+----+---------+-------+------------+
| ID | TYPE_ID | VALUE | SORT_ORDER |
+----+---------+-------+------------+
|  1 |       1 | AAA   |          1 |
|  1 |       1 | BBB   |          2 |
|  2 |       1 | AA1   |          1 |
|  3 |       1 | BB2   |          1 |
|  3 |       1 | AA2   |          2 |
|  3 |       1 | BB3   |          3 |
|  4 |       2 | AAA1  |          1 |
|  4 |       1 | BB4   |          2 |
|  4 |       1 | AA4   |          3 |
|  5 |       2 | BB5   |          1 |
|  5 |       2 | AA5   |          2 |
+----+---------+-------+------------+

但我希望以最小的sort_order获取每个ID的值,并且还将Type_id 1视为更高的优先级。我的分组正在获取Min(sort_order)的上表,因为我将每个行的值包括在内。以下是预期结果。

+----+---------+-------+------------+
| ID | TYPE_ID | VALUE | SORT_ORDER |
+----+---------+-------+------------+
|  1 |       1 | AAA   |          1 |
|  2 |       1 | AA1   |          1 |
|  3 |       1 | BB2   |          1 |
|  4 |       1 | BB4   |          2 |
|  5 |       2 | BB5   |          1 |
+----+---------+-------+------------+

请告诉我你的建议。

1 个答案:

答案 0 :(得分:6)

由于您使用的是SQL Server 2005+,获得结果的最简单方法是使用窗口函数。在这种情况下,您可以使用row_number()并按id对数据进行分区,但按type_idsort_order对数据进行排序:

;with cte as
(
  select id, type_id, value, sort_order,
    rn = row_number() over(partition by id order by type_id, sort_order)
  from yourtable
)
select id, type_id, value, sort_order
from cte
where rn = 1

Demo。添加row_number()后,您将只返回行号= 1的行。