【问题标题】:Return only the highest-valued row仅返回最高值的行
【发布时间】:2019-09-17 11:48:06
【问题描述】:

我正在尝试寻找一种解决方案,只返回 SQL 查询中价值最高的行

我有一个查询,它将两个表连接在一起,然后检查 id 在不同表中匹配的次数(在“athelete”中,id 参数是唯一的)。

SELECT t.athlete_id, count(a.id) as 'Number of activities' FROM training_session t
    INNER JOIN athlete a ON t.athlete_id = a.id
    WHERE t.athlete_id = a.id
    GROUP BY a.id

返回下表

athlete_id    Number of activities     
1                         4
2                         1
3                         1
4                         1
5                         1
6                         1

发出的问题是我只想返回活动数量最多的行。根据上表,这应该是 athlete_id = 1 因为它的活动量最大。

如果我能提供一些关于如何改进我的查询以匹配这些查询的建议,我将不胜感激。

【问题讨论】:

    标签: sql mariadb


    【解决方案1】:

    使用ORDER BYLIMIT

    SELECT t.athlete_id, count(*) as `Number of activities`
    FROM training_session t INNER JOIN
         athlete a
         ON t.athlete_id = a.id
    GROUP BY t.athlete_id
    ORDER BY COUNT(*) DESC
    LIMIT 1;
    

    我认为这个查询不需要JOIN

    SELECT t.athlete_id, COUNT(*) as `Number of activities`
    FROM training_session t 
    GROUP BY t.athlete_id
    ORDER BY COUNT(*) DESC
    LIMIT 1;
    

    如果您希望所有行都出现平局,那么这需要更多的工作。我会推荐排名函数:

    SELECT *
    FROM (SELECT t.athlete_id, COUNT(*) as `Number of activities`,
                 RANK() OVER (ORDER BY COUNT(*) DESC) as seqnum
          FROM training_session t 
          GROUP BY t.athlete_id
         ) t
    WHERE seqnum = 1;
    

    【讨论】:

    • 谢谢,这绝对是一些有趣的解决方案。看到有更多经验的人构建查询并了解如何将它们分层以形成解决方案,这很有趣。这将完美地工作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多