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)