SQL - 从MAX()获取相同行的值的聚合函数

时间:2010-07-12 08:04:33

标签: sql-server-2005 group-by max

我有一个包含列通道,值和时间戳的表,另一个表包含7个其他具有各种数据的列。

我将这两个加在一起,我想在一小时内选择值列的最大值,以及相应行的时间戳。这是我尝试过的,但它(显然)不起作用。

SELECT
    v.channel,
    MAX(v.value),
    v.timestamp,
    i.stuff,
    ...
FROM
    Values v
INNER JOIN
    @Information i
ON i.type = v.type
GROUP BY channel, DATEPART(HOUR, timestamp), i.stuff, ...

我(并不奇怪)得到以下错误:

  

“dbo.Values.timestamp”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

我该如何正确地做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以使用RANK()或DENSE_RANK()功能来获取适当的结果。类似的东西:

;WITH RankedResults AS
(
    SELECT
        channel,
        value,
        timestamp,
        type,
        RANK() OVER (PARTITION BY DATEPART(hour,timestamp) ORDER BY value desc) as Position
    FROM
        Values
)
SELECT
   v.channel,
   v.value,
   v.timestamp,
   i.stuff
   /* other columns */
FROM
   RankedResults v
       inner join
   @Information i
       on
           v.type = i.type
WHERE
   v.Position = 1

(是否使用RANK或DENSE_RANK取决于你想要在关系的情况下做什么,真的)

(编辑SQL以包含联接,以响应Tomas的评论)

答案 1 :(得分:0)

您必须在Group By子句中包含'v.timestamp'。 希望这对你有所帮助。