如何根据多个MAX条件选择每个组的单个记录?

时间:2014-07-06 15:51:44

标签: sql postgresql greatest-n-per-group

我有两张桌子:

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小提琴这个数据:http://sqlfiddle.com/#!15/1d12d

我想为给定用户执行的每个锻炼名称找到“最难”的锻炼。 “最难”的意思是指具有最高难度级别的训练以及该难度级别的最高回合数。在上面给出的例子中,我应该获得带有ID 4和7的锻炼记录。

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

我正在使用PostgreSQL 9.3。

1 个答案:

答案 0 :(得分: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