2015-01-05 5 views
-2

테이블 구조 :SQL 쿼리 MAX (SUM (..))

Article(
    model int(key), 
    year int(key), 
    author varchar(key), 
    num int) 

NUM : 기사의 수는

는 연간 그들 각자가이어야 쓴 모든 저자를 찾아 한 해 동안 쓴 (다른 모든 저자들에 비해) 제품의 최대 수

내가 시도 :

SELECT author FROM Article, 
(SELECT year,max(sumnum) s FROM 
(SELECT year,author,SUM(num) sumnum FROM Article GROUP BY year,author) 
GROUP BY year) AS B WHERE Article.year=B.year and Article.num=B.s; 

이 올바른 ANS인가 워? 감사합니다. .

+1

아니요, 올바른 대답이 아닙니다. 대부분의 데이터베이스에서는'having' 절에 구문 오류가 반환됩니다. –

+0

고쳐 주셔서 고마워요. – Signer3

+0

JOIN으로 전환하십시오. RA에서 더 의미가 있으며 "아하!"가 될 것입니다. 한 번 본. – user2864740

답변

2

당신은 숙제와 유효한 시도에 대해 언급하고 있지만 부정확합니다.

모델 열이 자동 증가와 같은 전제 (샘플 데이터가 없으므로 불분명 함)이며 저자 당 연간 하나의 항목 만있을 것이며 해당 연도의 동일한 저자에 대한 같은 해. 예 :

model year author num 
===== ==== ====== === 
1  2013 A  15 
2  2013 C  18 
3  2013 X  17 
4  2014 A  16 
5  2014 B  12 
6  2014 C  16 
7  2014 X  18 
8  2014 Y  18 

예상 결과는 2013 년 최고 기사 집계이며 저자 "C"만 반환합니다. 2014 년, 가장 높은 문서 수는 18이며 ​​ 이

첫째, 작성 기사의 최대 수 있었는지의 쿼리를 ... 얻을

select 
     year, 
     max(num) as ArticlesPerYear 
    from 
     Article 
    GROUP BY 
     year 

이 줄 것

저자 "X"와 "Y"를 반환 1 년에 한 건의 기록과 출판 된 기사의 최대 수 ... 2010-2014 년의 데이터가있는 경우 5 개의 레코드가 반환됩니다.이제, 원래 일치 한 해를 보냈 테이블과 글이 합류하는 것만 큼 간단

select 
     A2.* 
    from 
     (select 
       year, 
       max(num) as ArticlesPerYear 
      from 
       Article 
      GROUP BY 
       year) PreQuery 
     JOIN Article A2 
      on PreQuery.Year = A2.Year 
      AND PreQuery.ArticlesPerYear = A2.num 
2

당신은 당신이 찾고있는 무엇을 얻기 위해 자기 JOIN을 시도 할 수 있습니다 : (이것은 ANSI을 같이) 당신이 (가) SUM 의대 num의의 MAX 만지고있다

SELECT Main.author 
FROM Article AS Main 
INNER JOIN (
    SELECT year 
     ,author 
     ,SUM(num) AS sumnum 
    FROM Article 
    GROUP BY year 
     ,author 
) AS SumMain 
    ON SumMain.year = Main.year 
     AND SumMain.author = Main.author 
GROUP BY Main.author 
HAVING SUM(Main.num) = MAX(SumMain.sumnum) 
; 

이 보장 것 당신이 필요로하는 것에 대한 결과를 되 찾는 것. 제공된 정보로 인해이 두 필드에 대해서만 JOIN이 적용된다는 것을 명심하십시오. JOIN의 고유 ID가 있거나 1 대 1 매치를 얻으려면 더 많은 특이성이 필요하므로 적절히 조정하십시오.

SELECT author 
FROM (
    SELECT year 
     ,author 
     ,SUM(num) AS sumnum 
    FROM Article 
    GROUP BY year 
     ,author 
    HAVING SUM(num) = MAX(sumnum) 
) AS Main 
; 

일부의 DBMS가 여러 집계 기능을 할 수 있도록,이가 일할 수 :

는 사용중인 DBMS 내용에 따라, 두 가지 방법 중 하나를 단순화 할 수있다. 당신이 경우 일을 처리하기 위해 더 많은 매개 변수를해야 할 수도 있지만,

SELECT author 
FROM (
    SELECT year 
     ,author 
     ,SUM(num) AS sumnum 
    FROM Article 
    GROUP BY year 
     ,author 
) AS Main 
QUALIFY (
    ROW_NUMBER() OVER (
     PARTITION BY author 
      ,year 
     ORDER BY sumnum DESC 
    ) = 1 
) 
; 

오직 최고 sumnum로 결과 집합을 제한 할 것이다 : 당신의 DBMS는 OLAP 기능을 수행 할 수 있습니다 경우

, 당신은 이런 식으로 뭔가를 할 수 당신은 year이 포함되기를 바랐다. (당신은 GROUP이다.

희망이 도움이됩니다.

0

나는 CTE

WITH maxyear AS 
    (SELECT year, max(num) AS max_articles 
    FROM article 
    GROUP BY year) 
SELECT DISTINCT author 
FROM article a 
JOIN maxyear m 
ON a.year=m.year AND a.num=m.max_articles; 

을 제안하고 다른있는 파티션에 성능이 비교

SELECT DISTINCT author FROM 
    (SELECT author, rank() AS r 
    OVER (PARTITION BY year ORDER BY num DESC) 
    FROM article) AS subq 
WHERE r = 1; 

방법

은 좀 RDBMS 당신이 하위 쿼리에 HAVING rank()=1을 넣어 다음 중첩 쿼리 할 필요가 없습니다 할 것이라 생각합니다.