我编写了复杂查询并获取如下所示的数据:
+----+---------+-------+------------+
| 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 |
+----+---------+-------+------------+
请告诉我你的建议。
答案 0 :(得分:6)
由于您使用的是SQL Server 2005+,获得结果的最简单方法是使用窗口函数。在这种情况下,您可以使用row_number()
并按id
对数据进行分区,但按type_id
和sort_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的行。