Postgresql 查找自然联接表的最大值

Postgresql 查找自然联接表的最大值,postgresql,Postgresql,我有两张桌子:一张桌子和一张桌子。 我制作了一个自然联接表,以确定有多少人参加某一课程。即: course_id | sec_id | semester | year | count -----------+--------+----------+------+------- CS-101 | 1 | Fall | 2009 | 6 CS-347 | 1 | Fall | 2009 | 2 PHY-101 | 1

我有两张桌子:一张桌子和一张桌子。 我制作了一个自然联接表,以确定有多少人参加某一课程。即:

 course_id | sec_id | semester | year | count 
-----------+--------+----------+------+-------
 CS-101    | 1      | Fall     | 2009 |     6
 CS-347    | 1      | Fall     | 2009 |     2
 PHY-101   | 1      | Fall     | 2009 |     1
使用这个自然联接表,我想找到注册人数最多的课程

SELECT course_id, sec_id, semester, year, tb.count
FROM 
    (SELECT course_id, sec_id, semester, year, COUNT(*)
    FROM section
    NATURAL JOIN takes
    WHERE (semester, year) = ('Fall', 2009)
    GROUP BY course_id, sec_id, semester, year) AS tb
WHERE  
  tb.count = 
  (SELECT max(tb.count)
   FROM 
       (SELECT course_id, sec_id, semester, year, COUNT(*)
       FROM section
       NATURAL JOIN takes
       WHERE (semester, year) = ('Fall', 2009)
       GROUP BY course_id, sec_id, semester, year) AS tb
  ) ;
这就是我尝试过的,而且很有效!显示:

 course_id | sec_id | semester | year | count 
-----------+--------+----------+------+-------
 CS-101    | 1      | Fall     | 2009 |     6
但是代码似乎太冗余了,所以我想也许有一种更简单的方法来实现它。有没有一种方法可以获得相同的答案,而不必在where子句中重复相同的连接过程

在你的情况下,你可以使用限制条款

首先将最大值排序到顶部,然后仅给出第一条记录:

SELECT 
    <your query>
ORDER BY count DESC
LIMIT 1
秩将递增的值添加到每个唯一值中,在这种情况下,将递增的值添加到计数值中。绑定值获得相同的秩值。第一个始终是1,因此您可以在此之后进行筛选

在某些情况下,最好按照原来的方式,但将冗余代码提取到:

对于这个没有任何连接和进一步子查询的小示例,CTE似乎要快一点;你可以试一试

WITH cte AS (
    <your query>
)
SELECT
    *
FROM
    cte
WHERE count = (SELECT max(count) FROM cte)

谢谢你的回答!这太棒了。但是假设我想得到所有具有相同最大值的行,有没有其他方法??为扩展问题添加了解决方案添加了另一个想法
WITH cte AS (
    <your query>
)
SELECT
    *
FROM
    cte
WHERE count = (SELECT max(count) FROM cte)