2016-12-08 6 views
0

지난 달 동안 그룹 당 한 달에 여러 값을 가진 10 개의 그룹에서 가장 높은 값을 보여주고 싶습니다.쿼리에서 집계 관련 문제

나는 내 방식대로입니다.

SELECT 
    Group, MAX(Value), Date 
FROM 
    <relevant tables> 
GROUP BY 
    Group, Date 

그러나이 그룹에서 모든 반환은, 그 기간에 걸쳐 각에서 가장 높은이 필요합니다 (예를 들어 단지 '0007' '1002415.59' '2016년 11월 11일'는 0007 라인 중 하나에 대한)

0007 27456.14 2016-11-07 
0082 2406.30  2016-11-07 
0007 33038.34 2016-11-08 
0082 569.37  2016-11-08 
0007 1274.78  2016-11-09 
0088 2266.00  2016-11-09 
0007 124.57  2016-11-10 
6082 2407.27  2016-11-10 
0007 1002415.59 2016-11-11 
0882 90.30  2016-11-11 
0477 67.90  2016-11-12 
0067 66.33  2016-11-13 

이 수준의 집계로 고생하고 있습니다.

나는 올바른 방향으로 최소한의 움직임만으로 만족합니다. 열팽창 계수는 단지 현재의 로직을 캡슐화하는 데 사용됩니다

with t as (
     SELECT . . . 
     FROM <relevant tables> 
    ) 
select t.* 
from (select t.*, 
      row_number() over (partition by grp order by date desc) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

:

+0

사용중인 dbms에 태그를 지정하십시오. –

+0

어떤 dbms를 사용하고 있습니까? (이 솔루션은 제품의 기능에 달려 있습니다.) – jarlh

+0

사과! – Khaelas

답변

0

시작하려면 : GROUP BY x, y, z 내가 XYZ 당 하나 개의 결과 행을 원한다 "의미 콤비네이션". GROUP BY Group, Date을 사용하고 있으므로 그룹 및 날짜별로 결과 행을 하나씩 가져 오는 것이 놀랄 일이 아닙니다. 그룹당 하나의 결과 행을 얻으려면 GROUP BY Group이어야합니다.

그러나 집계를 전혀 찾고 있지 않습니다. 즉, 한 그룹의 레코드를보고 그 그룹의 데이터를 수집합니다. 당신이하고 싶은 것은 특정 기록과 다른 기록을 보여주는 것입니다. 이것은 WHERE에서 이루어집니다. 기록의 순위를 매기려면 ROW_NUMBER을 사용하십시오 (다른 시나리오에서는 RANK 또는 DENSE_RANK).

SELECT [Group], Value, [Date] 
FROM 
(
    SELECT 
    [Group], Value, [Date], 
    row_number() over (partition by [Group] order by Value desc) as rn 
    FROM <relevant tables> 
) data 
WHERE rn = 1; 
+0

정말 고마워요, 이것도 효과가 있었고 앞으로도 유용하다는 것을 이해합니다! – Khaelas

2

이 작업을 수행하는 일반적인 방법은 ANSI 표준 row_number 기능을 사용하는 것입니다.

0

약간 길지만 작은 부분으로 나누는 방법을 이해하는 데 도움이됩니다. 성능 고려 사항이있는 경우 쿼리를 다시 작성하고 최적화 할 수 있습니다.

SELECT 그룹, MAX (값) MaximumValue, 그룹 BY 그룹에서 #tmpGroupMaximumValue INTO 날짜, 날짜 등의

SELECT 
Group,DENSE_RANK() OVER (
     PARTITION BY A.Group ORDER BY A.MaximumValue DESC 
     ) as [MaxGroupValueRank], [Date] INTO #tmpB 
FROM #tmpGroupMaximumValue A 


SELECT * FROM #tmpB WHERE [MaxGroupValueRank] = 1