查找自然联接表的最大值

李四月

我有两个表: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子句中再次重复相同的加入过程?

男装

演示:db <>小提琴

您可以使用该LIMIT子句。

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

SELECT 
    <your query>
ORDER BY count DESC
LIMIT 1

如果要获取所有最大值(例如,如果有两个记录count = 6),则可以使用rank()window函数

演示:db <>小提琴

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

联接表中的多个最大值

来自分类Dev

MySQL-从联接表返回最大值

来自分类Dev

尝试以最大值联接行中的表

来自分类Dev

查找表中聚合值之间的最大值

来自分类Dev

使用excel vba查找最大值并返回表的标题

来自分类Dev

查找键的最大值

来自分类Dev

PHP-查找最大值/最大值

来自分类Dev

连接表的最大值

来自分类Dev

在两个联接表中选择与最大值对应的列

来自分类Dev

3个表上的内部联接如何获取日期最大值的ID?

来自分类Dev

使用mysql语句联接表并返回最大值而不是PHP数学

来自分类Dev

如何从多个联接表MySQL中选择不同的最大值

来自分类Dev

获取列的最大值并将它们与另一个表联接

来自分类Dev

查找连续相似值的最大值

来自分类Dev

Excel查找值旁边的最大值

来自分类Dev

查找哈希值的键的最大值

来自分类Dev

自然联接表

来自分类Dev

Java 8查找最大值

来自分类Dev

查找列表的最大值(Python)

来自分类Dev

MongoDB查找并全部返回最大值

来自分类Dev

通过分组查找最大值

来自分类Dev

在C中查找char的最大值

来自分类Dev

用列表递归查找最大值

来自分类Dev

Spark Scala DataFrame查找最大值

来自分类Dev

查找10个线程的最大值

来自分类Dev

在CUDA中查找矩阵的最大值

来自分类Dev

查找最大值,除0外

来自分类Dev

在嵌套列表中查找最大值

来自分类Dev

在列表中查找最大值