根据一列的最小值选择行

时间:2018-03-14 12:28:22

标签: sql sql-server tsql

我需要在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

3 个答案:

答案 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)