有没有更简单的方法来查找具有最大值的行?

时间:2018-02-13 15:50:12

标签: sql database postgresql

我有一个架构,其中存在这两个表(等等)

参与

+------+--------+------------------+
| movie| person |       role       |
+------+--------+------------------+
|    1 |      1 | "Regisseur"      |
|    1 |      1 | "Schauspieler"   |
|    1 |      2 | "Schauspielerin" |
|    2 |      3 | "Regisseur"      |
|    3 |      4 | "Regisseur"      |
|    3 |      5 | "Schauspieler"   |
|    3 |      6 | "Schauspieler"   |
|    4 |      7 | "Schauspielerin" |
|    4 |      8 | "Schauspieler"   |
|    5 |      1 | "Schauspieler"   |
|    5 |      8 | "Schauspieler"   |
|    5 |     14 | "Schauspieler"   |
+------+--------+------------------+

电影

+----+------------------------------+------+-----+
| id |            title             | year | fsk |
+----+------------------------------+------+-----+
|  1 | "Die Bruecke am Fluss"       | 1995 |  12 |
|  2 | "101 Dalmatiner"             | 1961 |   0 |
|  3 | "Vernetzt - Johnny Mnemonic" | 1995 |  16 |
|  4 | "Waehrend Du schliefst..."   | 1995 |   6 |
|  5 | "Casper"                     | 1995 |   6 |
|  6 | "French Kiss"                | 1995 |   6 |
|  7 | "Stadtgespraech"             | 1995 |  12 |
|  8 | "Apollo 13"                  | 1995 |   6 |
|  9 | "Schlafes Bruder"            | 1995 |  12 |
| 10 | "Assassins - Die Killer"     | 1995 |  16 |
| 11 | "Braveheart"                 | 1995 |  16 |
| 12 | "Das Netz"                   | 1995 |  12 |
| 13 | "Free Willy 2"               | 1995 |   6 |
+----+------------------------------+------+-----+

我希望获得参与人数最多的电影。我想出了一个实际执行此操作的SQL语句,但看起来非常复杂。它看起来像这样:

SELECT titel 
FROM   movie.movie 
       JOIN (SELECT * 
             FROM   (SELECT Max(count_person) AS max_count_person 
                     FROM   (SELECT movie, 
                                    Count(person) AS count_person 
                             FROM   movie.participation 
                             GROUP  BY movie) AS countPersons) AS 
                    maxCountPersons 
                    JOIN (SELECT movie, 
                                 Count(person) AS count_person 
                          FROM   movie.participation 
                          GROUP  BY movie) AS countPersons 
                      ON maxCountPersons.max_count_person = 
                         countPersons.count_person) 
                               AS maxPersonsmovie 
         ON maxPersonsmovie.movie = movie.id 

主要问题是,我找不到更简单的方法来选择具有最高值的行。如果我只是在内表上做出选择并在count_person上选择具有最高值的行而不会丢失有关电影本身的信息,那么这看起来会更简单。有没有办法简化这个,或者这真的是最简单的方法吗?

3 个答案:

答案 0 :(得分:1)

这是一种没有子查询的方法:

extension UINavigationController {
    func viewController<T: UIViewController>(class: T.Type) -> T? {

        return viewControllers.filter({$0 is T}).first as? T
    }
}

//

if let controller = navigationController?.viewController(class: MainViewController.self) {
     controller.data = data
}

navigationController?.popViewController(animated: true)

如果您愿意,可以使用SELECT m.title FROM movie.movie m JOIN movie.participation p ON m.id = p.movie GROUP BY m.title ORDER BY COUNT(*) DESC FETCH FIRST 1 ROW ONLY; 代替LIMIT 1

注意:如果是关系,则只返回一个值。这似乎与你的问题一致。

答案 1 :(得分:0)

您可以使用rank窗口功能来执行此操作。

SELECT title
FROM (SELECT m.title,rank() over(order by count(p.person) desc) as rnk
      FROM movie.movie m
      LEFT JOIN movie.participation p ON m.id=p.movie
      GROUP BY m.title
     ) t
WHERE rnk=1

答案 2 :(得分:0)

SELECT title
FROM   movie.movie
WHERE  id = (SELECT   movie
             FROM     movie.participation
             GROUP BY movie
             ORDER BY count(*) DESC
             LIMIT 1);