0

有时我希望执行连接,从而获取一列的最大值。这样做我必须执行 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 的最大值匹配),我有点头疼。

如果有一个额外的列 - col3 并且对于上述查询返回的行,我只想返回一个,例如最小 Col3 值 - 我该怎么做?

4

3 回答 3

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
于 2012-06-07T09:25:11.667 回答
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 )
于 2012-06-07T09:26:04.760 回答
1

假设您使用的是 SQL-Server 2005 或更高版本,您可以在此处使用Window 函数。我选择了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

inside子句相当于子查询PARTITION BYOVER的 group by,然后您ORDER BY确定开始对行进行编号的顺序。在这种情况下Col2 DESC,从 col2 的最高值开始(相当于您的MAX声明)。

于 2012-06-07T09:28:14.493 回答