sql - 如何根据多个 MAX 条件为每组选择一条记录?

标签 sql postgresql greatest-n-per-group

我有 2 张 table :

workouts
id,    name, difficulty_level, rounds_count, some other columns...
 1,     'a',                1,            1
 2,     'a',                1,            5
 3,     'a',                2,            1
 4,     'a',                2,            5

 5,     'b',                1,            1 
 6,     'b',                1,            5
 7,     'b',                2,            1
 8,     'b',                2,            5

trainings
id, user_id,       workout_id,   created_at, some other columns...
 1,       1,                6,   2014-07-06
 2,       1,                1,   2014-07-07
 3,       1,                4,   2014-07-08
 4,       1,                7,   2014-07-09

这是使用此数据的 SQL Fiddle:http://sqlfiddle.com/#!15/1d12d

我想找到给定用户执行过的每个锻炼名称的“最难”锻炼。我所说的“最难”是指具有最高难度级别的训练,并且该难度级别的轮数最高。在上面给出的示例中,我应该获取 ID 为 4 和 7 的锻炼记录。

还有另一种可能的方法来解决这个问题。找到每个给定锻炼名称的“最难”锻炼的整个想法是为了防止为给定用户创建比已经执行的“更容易”锻炼的新训练。因此,假设它工作正常,给定锻炼名称的最后一次训练应该始终指向迄今为止“最难”的锻炼。

我使用的是 PostgreSQL 9.3。

最佳答案

SQL Fiddle

select distinct on (user_id, name)
    user_id, name, w.id as workout_id,
    difficulty_level, rounds_count
from
    workouts w
    inner join
    trainings t on t.workout_id = w.id
order by user_id, name, difficulty_level desc, rounds_count desc

关于sql - 如何根据多个 MAX 条件为每组选择一条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24597626/

相关文章:

python sqlite字符串比较

sql - 如何在Sql Server 中获取最大值的多个字段?

mysql - 如何从 2 个表中进行选择并从一个表中获取最高值?

sql - 找出第一个超过一定值的记录

使用主键的 SQL 查询

mysql - 数据库查询相关问题

SQL: ID x 在日期 y 的状态是什么(有没有更有效的方法?)

oracle 存储过程 OUT 参数与 postgresql pl/pgsql 函数 OUT 参数

spring - 来自 spring 应用程序的数据未保存在 dockerized Postgres 数据库中

mysql - 每天获得最多点赞的行