多行匹配,但我只想要一个?

时间:2012-06-07 09:21:04

标签: sql sql-server

有时候我希望执行一个连接,我取一列的最大值。这样做我必须执行max()和groupby-这会阻止我从最大的行中检索其他列(因为它们不包含在GROUP BY或聚合函数中)。

要解决此问题,我将最大值加回原始数据源,以获取其他列。但是,我的问题是这有时会返回多行。

所以,到目前为止,我有类似的东西:

SELECT * FROM
    (SELECT Col1, Max(Col2) FROM Table GROUP BY Col1) tab1
JOIN
    (SELECT Col1, Col2 FROM Table) tab2
ON tab1.Col2 = tab2.Col2

如果上面的查询现在返回三行(与column2的最大值匹配),我有点头疼。

如果有一个额外的column-col3和上面查询返回的行,我只想返回那个,比如最小Col3值 - 我该怎么做?

3 个答案:

答案 0 :(得分:4)

如果您使用的是SQL Server 2005+。然后你就可以这样做:

CTE方式

;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY Col1 ORDER BY Col2 DESC) AS RowNbr,
        table.*
    FROM
        table
)
SELECT
    *
FROM
    CTE
WHERE
    CTE.RowNbr=1

子查询方式

SELECT
    *
FROM
    (
    SELECT
        ROW_NUMBER() OVER(PARTITION BY Col1 ORDER BY Col2 DESC) AS RowNbr,
        table.*
    FROM
        table
    ) AS T
WHERE
    T.RowNbr=1

答案 1 :(得分:1)

我得到它可能是这样的

SELECT * FROM
    (SELECT Col1, Max(Col2) FROM Table GROUP BY Col1) tab1
JOIN
    (SELECT Col1, Col2 FROM Table) tab2
ON tab1.Col2 = tab2.Col2 and Col3 = (select min(Col3) from table )

答案 2 :(得分:1)

假设您使用的是SQL-Server 2005或更高版本您可以在此处使用Window functions。我选择了ROW_NUMBER(),但它不是唯一的选择。

;WITH T AS
(   SELECT  *,
            ROW_NUMBER() OVER(PARTITION BY Col1 ORDER BY Col2 DESC) [RowNumber]
    FROM    Table
)
SELECT  *
FROM    T
WHERE   RowNumber = 1

PARTITION BY子句中的OVER与子查询中的组相同,然后ORDER BY确定开始编号行的顺序。在这种情况下,Col2 DESC以col2的最高值开头(相当于您的MAX语句)。