복붙노트

[SQL] 나는 SQL에서 최대 (COUNT (*)를) 할 수 있습니까?

SQL

나는 SQL에서 최대 (COUNT (*)를) 할 수 있습니까?

여기 내 코드는 :

    select yr,count(*)  from movie
join casting on casting.movieid=movie.id
join actor on casting.actorid = actor.id
where actor.name = 'John Travolta'
group by yr

여기에 질문입니다

여기에 테이블 구조는 다음과 같습니다

movie(id, title, yr, score, votes, director)
actor(id, name)
casting(movieid, actorid, ord)

이것은 내가 무엇입니까 출력입니다 :

yr  count(*)
1976    1
1977    1
1978    1
1981    1
1994    1
etcetc

나는 계산 (*)가 최대 인에 대한 행을 얻을 필요가있다.

이걸 어떻게해야합니까?

해결법

  1. ==============================

    1.사용하다:

    사용하다:

      SELECT m.yr, 
             COUNT(*) AS num_movies
        FROM MOVIE m
        JOIN CASTING c ON c.movieid = m.id
        JOIN ACTOR a ON a.id = c.actorid
                    AND a.name = 'John Travolta'
    GROUP BY m.yr
    ORDER BY num_movies DESC, m.yr DESC
    

    NUM_MOVIES의 DESC로 주문하면 결과 집합의 상단에 가장 높은 값을 넣어 것입니다. 수많은 년 같은 수있는 경우 m.yr 다음 NUM_MOVIES 값이 변경 될 때까지 ... 맨 위에 가장 최근 해 배치합니다.

    아니, 당신은 같은 SELECT 절에서 서로의 상단에 집계 함수 레이어 수 없습니다. 내부 집계 하위 쿼리에서 수행되어야 할 것이다. IE :

    SELECT MAX(y.num)
      FROM (SELECT COUNT(*) AS num
              FROM TABLE x) y
    
  2. ==============================

    2.계산에 의해 그냥 순서 (*) DESC 당신이 얻을 것이다 가장 높은 (당신이 제한 1과 결합하는 경우)

    계산에 의해 그냥 순서 (*) DESC 당신이 얻을 것이다 가장 높은 (당신이 제한 1과 결합하는 경우)

  3. ==============================

    3.

    SELECT * from 
    (
    SELECT yr as YEAR, COUNT(title) as TCOUNT
    FROM actor
    JOIN casting ON actor.id = casting.actorid
    JOIN movie ON casting.movieid = movie.id
    WHERE name = 'John Travolta'
    GROUP BY yr
    order by TCOUNT desc
    ) res
    where rownum < 2
    
  4. ==============================

    4.그것은이 사이트에서입니다 - http://sqlzoo.net/3.htm 이 개 가능한 솔루션 :

    그것은이 사이트에서입니다 - http://sqlzoo.net/3.htm 이 개 가능한 솔루션 :

    TOP 1과 ORDER BY ... DESC :

    SELECT yr, COUNT(title) 
    FROM actor 
    JOIN casting ON actor.id=actorid
    JOIN movie ON movie.id=movieid
    WHERE name = 'John Travolta'
    GROUP BY yr
    HAVING count(title)=(SELECT TOP 1 COUNT(title) 
    FROM casting 
    JOIN movie ON movieid=movie.id 
    JOIN actor ON actor.id=actorid
    WHERE name='John Travolta'
    GROUP BY yr
    ORDER BY count(title) desc)
    

    MAX와 :

    SELECT yr, COUNT(title) 
    FROM actor  
    JOIN casting ON actor.id=actorid    
    JOIN movie ON movie.id=movieid
    WHERE name = 'John Travolta'
    GROUP BY yr
    HAVING 
        count(title)=
            (SELECT MAX(A.CNT) 
                FROM (SELECT COUNT(title) AS CNT FROM actor 
                    JOIN casting ON actor.id=actorid
                    JOIN movie ON movie.id=movieid
                        WHERE name = 'John Travolta'
                        GROUP BY (yr)) AS A)
    
  5. ==============================

    5.이 질문은 오래지만, dba.SE.에 새로운 질문에 참조 된 나는 또 하나를 추가하고 있도록 최고의 솔루션을 제공, 아직되지 않은 생각합니다.

    이 질문은 오래지만, dba.SE.에 새로운 질문에 참조 된 나는 또 하나를 추가하고 있도록 최고의 솔루션을 제공, 아직되지 않은 생각합니다.

    첫째는, (일반적으로 외래 키 제약 조건과 시행) 참조 무결성을 가정 당신은 전혀 테이블 영화에 가입 할 필요가 없습니다. 즉 쿼리에 죽은화물입니다. 모든 답은 지금까지 그것을 지적하지 못한다.

    (이 질문은 질문 전에, 2009-07-01 출시) 네, 포스트 그레스 8.4 이상 당신은 윈도우 함수에서 집계 함수를 중첩하여 해당를 얻을 수 있습니다 : 제목에 질문에 대답하려면 :

    SELECT c.yr, count(*) AS ct, max(count(*)) OVER () AS max_ct
    FROM   actor   a
    JOIN   casting c ON c.actorid = a.id
    WHERE  a.name = 'John Travolta'
    GROUP  BY c.yr;
    

    SELECT 쿼리 이벤트의 순서를 고려 :

    (수) 단점 : 윈도우 함수는 없습니다 집계 행을한다. 당신은 집계 단계 이후 남은 모든 행을 얻을. 일부 쿼리에 유용하지만,이 일에 적합하지.

    가장 높은 카운트 하나 개의 행을 얻으려면, 당신은 암시 @wolph 같은 ORDER BY 코네티컷 LIMIT 1을 사용할 수 있습니다 :

    SELECT c.yr, count(*) AS ct
    FROM   actor   a
    JOIN   casting c ON c.actorid = a.id
    WHERE  a.name = 'John Travolta'
    GROUP  BY c.yr
    ORDER  BY ct DESC
    LIMIT  1;
    

    기본적인 SQL을 사용하면 어떤 중간 괜찮은 RDBMS에서 사용할 수있는 기능 - 제한 구현이 달라집니다

    또는 당신은 DISTINCT ON (전용 포스트 그레스)로 가장 카운트 그룹 당 하나 개의 행을 얻을 수 있습니다 :

    하지만 당신에 대한 질문 :

    아마도 더보다. 가장 우아한 해결책은 하위 쿼리에서 윈도우 함수 순위 ()와 함께합니다. 라이언 쿼리를 제공하지만 (위의 내 대답에 세부 사항) 간단 할 수 있습니다 :

    SELECT yr, ct
    FROM  (
       SELECT c.yr, count(*) AS ct, rank() OVER (ORDER BY count(*) DESC) AS rnk
       FROM   actor   a
       JOIN   casting c ON c.actorid = a.id
       WHERE  a.name = 'John Travolta'
       GROUP  BY c.yr
       ) sub
    WHERE  rnk = 1;
    

    현재 모든 주요 RDBMS 지원 윈도우 함수. MySQL과 포크를 제외하고 (MariaDB는 버전 10.2에서 마지막에 그들을 구현 한 것으로 보인다).

  6. ==============================

    6.한계와 최대 사용 만 당신에게 첫 번째 행을 줄 것이다, 그러나 최대 영화 같은 수의 두 개 이상의 행이있는 경우에, 당신은 일부 데이터를 그리워 할 것입니다. 다음은 사용할 수있는 순위 () 함수가 있다면 그것을 할 수있는 방법입니다.

    한계와 최대 사용 만 당신에게 첫 번째 행을 줄 것이다, 그러나 최대 영화 같은 수의 두 개 이상의 행이있는 경우에, 당신은 일부 데이터를 그리워 할 것입니다. 다음은 사용할 수있는 순위 () 함수가 있다면 그것을 할 수있는 방법입니다.

    SELECT
        total_final.yr,
        total_final.num_movies
        FROM
        ( SELECT 
            total.yr, 
            total.num_movies, 
            RANK() OVER (ORDER BY num_movies desc) rnk
            FROM (
                   SELECT 
                          m.yr, 
                          COUNT(*) AS num_movies
                   FROM MOVIE m
                   JOIN CASTING c ON c.movieid = m.id
                   JOIN ACTOR a ON a.id = c.actorid
                   WHERE a.name = 'John Travolta'
                   GROUP BY m.yr
                 ) AS total
        ) AS total_final 
       WHERE rnk = 1
    
  7. ==============================

    7.다음 코드는 당신에게 대답을 제공합니다. 그것은 본질적으로 ALL을 사용하여 MAX (COUNT (*))를 구현합니다. 그것은 아주 기본적인 명령과 작업을 사용하는 장점이있다.

    다음 코드는 당신에게 대답을 제공합니다. 그것은 본질적으로 ALL을 사용하여 MAX (COUNT (*))를 구현합니다. 그것은 아주 기본적인 명령과 작업을 사용하는 장점이있다.

    SELECT yr, COUNT(title)
    FROM actor
    JOIN casting ON actor.id = casting.actorid
    JOIN movie ON casting.movieid = movie.id
    WHERE name = 'John Travolta'
    GROUP BY yr HAVING COUNT(title) >= ALL
      (SELECT COUNT(title)
       FROM actor
       JOIN casting ON actor.id = casting.actorid
       JOIN movie ON casting.movieid = movie.id
       WHERE name = 'John Travolta'
       GROUP BY yr)
    
  8. ==============================

    8.어떤 데이터베이스에 따라 당신이 사용하고있는 ...

    어떤 데이터베이스에 따라 당신이 사용하고있는 ...

    select yr, count(*) num from ...
    order by num desc
    

    내 경험의 대부분은 다른 DB에 비해 몇 가지 다른 구문을 사용하여베이스에 있습니다. 당신이 그것을 정렬 할 수 있도록 그러나이 경우, 당신은 내림차순으로, 당신의 카운트 열을 명명하고 있습니다. 당신은 한 단계 더 가서 처음 10 행 (그의 10 바쁜 년을 찾을 수)에 결과를 제한 할 수 있습니다.

  9. ==============================

    9.마지막 대답에 감사

    마지막 대답에 감사

    SELECT yr, COUNT(title)
    FROM actor
    JOIN casting ON actor.id = casting.actorid
    JOIN movie ON casting.movieid = movie.id
    WHERE name = 'John Travolta'
    GROUP BY yr HAVING COUNT(title) >= ALL
      (SELECT COUNT(title)
       FROM actor
       JOIN casting ON actor.id = casting.actorid
       JOIN movie ON casting.movieid = movie.id
       WHERE name = 'John Travolta'
       GROUP BY yr)
    

    저도 같은 문제를 겪고 : 나는 그들의 카운트가 막시무스 수를 일치 단지 기록 (이 하나 또는 여러 기록 될 수있다) 알 필요.

    나는 "ALL 절"에 대한 자세한 내용을 배울 수있다, 이것은 바로 내가 찾던 것을 간단한 솔루션의 일종이다.

  10. ==============================

    10.

         select top 1 yr,count(*)  from movie
    join casting on casting.movieid=movie.id
    join actor on casting.actorid = actor.id
    where actor.name = 'John Travolta'
    group by yr order by 2 desc
    
  11. ==============================

    11.

    create view sal as
    select yr,count(*) as ct from
    (select title,yr from movie m, actor a, casting c
    where a.name='JOHN'
    and a.id=c.actorid
    and c.movieid=m.id)group by yr
    

    ----- VIEW CREATED -----

    select yr from sal
    where ct =(select max(ct) from sal)
    

    2,013

  12. from https://stackoverflow.com/questions/2436820/can-i-do-a-maxcount-in-sql by cc-by-sa and MIT license