我有两个表:section和Take。我做了一个自然的联接表,以了解参加某门课程的人数。这是:
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子句中再次重复相同的加入过程?
您可以使用该LIMIT
子句。
首先将最大值排序到顶部,然后只给出第一条记录:
SELECT
<your query>
ORDER BY count DESC
LIMIT 1
如果要获取所有最大值(例如,如果有两个记录count = 6
),则可以使用rank()
window函数:
SELECT
*
FROM (
SELECT
*,
rank() OVER (ORDER BY count DESC)
FROM
<your query>
) s
WHERE rank = 1
rank()
向每个唯一值添加递增的值(在这种情况下,将count
值添加)。绑定值获得相同的等级值。第一个始终是1
,因此您可以在此之后进行过滤。
在某些情况下,最好采用原始方式,但将冗余代码提取到CTE(WITH
子句)中:
demo:db <> fiddle(对于这个没有连接和其他子查询的小例子,CTE似乎要快一些;您可以尝试一下)
WITH cte AS (
<your query>
)
SELECT
*
FROM
cte
WHERE count = (SELECT max(count) FROM cte)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句