Can I do a max(count(*)) in SQL?

前端 未结 11 1767
遥遥无期
遥遥无期 2020-11-29 01:02

Here\'s my code:

    select yr,count(*)  from movie
join casting on casting.movieid=movie.id
join actor on casting.actorid = actor.id
where actor.name = \'Jo         


        
相关标签:
11条回答
  • 2020-11-29 01:54

    it's from this site - http://sqlzoo.net/3.htm 2 possible solutions:

    with TOP 1 a 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)
    

    with 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)
    
    0 讨论(0)
  • 2020-11-29 01:54

    Using max with a limit will only give you the first row, but if there are two or more rows with the same number of maximum movies, then you are going to miss some data. Below is a way to do it if you have the rank() function available.

    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
    
    0 讨论(0)
  • 2020-11-29 01:59
    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)
    

    YR 2013

    0 讨论(0)
  • 2020-11-29 02:05

    Thanks to the last answer

    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)
    

    I had the same problem: I needed to know just the records which their count match the maximus count (it could be one or several records).

    I have to learn more about "ALL clause", and this is exactly the kind of simple solution that I was looking for.

    0 讨论(0)
  • 2020-11-29 02:07

    Use:

      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
    

    Ordering by num_movies DESC will put the highest values at the top of the resultset. If numerous years have the same count, the m.yr will place the most recent year at the top... until the next num_movies value changes.

    Can I use a MAX(COUNT(*)) ?


    No, you can not layer aggregate functions on top of one another in the same SELECT clause. The inner aggregate would have to be performed in a subquery. IE:

    SELECT MAX(y.num)
      FROM (SELECT COUNT(*) AS num
              FROM TABLE x) y
    
    0 讨论(0)
提交回复
热议问题