2010-07-12 132 views
0

我有一个带有列通道,值和时间戳的表,以及另一个带有7个其他列且具有各种数据的表。SQL - 从MAX()获取相同行的值的集合函数

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

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" is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause

我应该怎么做这是否正确?

+0

选择'DATEPART(HOUR,timestamp)'而不是? – Amber 2010-07-12 08:09:02

+0

@不幸的是,我需要确切的时间,而不仅仅是小时部分。 – 2010-07-12 08:24:43

回答

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包括联接,以响应托马斯评论)

+0

+1我认为这是最有效的方法。 – 2010-07-12 08:29:16

+0

虽然我确实过时了,但是第一个地方的领带总是位置1,所以在这种情况下RANK和DENSE_RANK完全等价 - 如果您需要消除关系,您必须在ORDER BY子句中添加更多的描述性列。 – 2010-07-12 08:34:20

+0

我应该在哪些select语句中进行连接? – 2010-07-12 09:01:28

0

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