2010-07-12 30 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'。 希望這會對你有所幫助。