我需要在MSSQL DB中选择具有不同列A值和最小值Order列的行。
每条记录右侧都有更多列。我知道我应该使用GROUP BY,但它确实会发出警告,当我想保持右侧的列很好时。
数据集示例:
A | Order | Multiple columns ... |
--------+-------+-------------------------+
A1 | 3 | ... |
A1 | 7 | ... |
A2 | 2 | ... |
A3 | 2 | ... |
A3 | 8 | ... |
所以我想得到这些结果:
A | Order | Multiple columns ... |
--------+-------+-------------------------+
A1 | 3 | ... |
A2 | 2 | ... |
A3 | 2 | ... |
我尝试使用的查询和抛出警告是这样的:
SELECT A, MIN(Order), Column B, Column C, Column D...
FROM Table
GROUP BY A
ORDER BY A
答案 0 :(得分:4)
可能最有效的方法(使用正确的索引)是:
select t.*
from t
where t.order = (select min(t2.order) from t t2 where t2.a = t.a);
更常见的方法是使用row_number()
,我也建议这样做。
答案 1 :(得分:3)
你也可以使用 top(1)with ties
select top (1) with ties a, *
from table t
order by row_number() over (partition by a order by [Order])
答案 2 :(得分:0)
如果您的数据集不是很大,以至于CTE是不可能的。
; WITH
CTE1 AS
(
SELECT
A
, Order
, B
, C
, D
, RowNumber = ROW_NUMBER() OVER (PARTITION BY A ORDER BY Order ASC)
FROM Table
)
SELECT
A
, Order
, B
, C
, D
WHERE (RowNumber = 1)