2010-07-12 5 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, ... 

I (하지 매우 놀라 울) 다음과 같은 오류 받고 있어요 :

"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

+0

@Amber, 불행히도, 시간 부분이 아니라 정확한 시간이 필요합니다. –

답변

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이 일을하는 가장 효율적인 방법이라고 생각합니다. –

+0

비록 내가 그것을 overthink했지만 첫 번째 장소에 대한 관계는 항상 1 순위를 얻으므로 RANK와 DENSE_RANK는이 경우 정확하게 동일합니다. 관계를 제거해야하는 경우 ORDER BY 절에 더 많은 무차별적인 열을 추가해야합니다. –

+0

선택 문 중 어느 것을 조인해야합니까? –

0

'Group By 절에'v.timestamp '를 포함해야합니다. 희망이 도움이 될 것입니다.

관련 문제