有时候我希望执行一个连接,我取一列的最大值。这样做我必须执行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值 - 我该怎么做?
答案 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
语句)。