Data Table
id dessert time user
1 eclair 10:00 Jon
2 banana 10:00 Mark
3 eclair 10:00 Paul
4 chocolate 08:00 Paul
5 eclair 10:00 Paul
6 chocolate 17:00 Jon
7 banana 21:00 Jon
8 eclair 21:00 Jon
Я стремлюсь получить среднее время, за каждого пользователя, что от них требуется десерт "шоколад" к десерту "эклер". В приведенном примере, он взял бы Пол два часа, в то время как Джон принимал четыре. Строки не обязательно рядом друг с другом.
Я бы просто использовал условную агрегацию:
select user,
min(case when dessert = 'chocolate' then time end) as chocolate_time,
max(case when dessert = 'eclair' then time end) as eclair_time,
timediff(min(case when dessert = 'chocolate' then time end) as chocolate_time,
max(case when dessert = 'eclair' then time end) as eclair_time
) as diff
from t
group by user;
Это время между первым появлением шоколада и последним появлением эклера.
Это предполагает, что любой данный пользователь имеет не более одного шоколада и одного эклера:
SELECT
Chocolate.[user] AS Dessert_User,
CONCAT(DATEPART(HOUR,DATEDIFF(HH, Chocolate.[time], Eclair.[time])),
':', DATEPART(MINUTE,DATEDIFF(HH, Chocolate.[time], Eclair.[time]))) AS Time_Taken
FROM
(
SELECT
dessert,
[time],
[user]
FROM
table
WHERE
dessert = 'chocolate'
) AS Chocolate
JOIN
(
SELECT
dessert,
[time],
[user]
FROM
table
WHERE
dessert = 'eclair'
) AS Eclair
ON
Chocolate.[user] = Eclair.[user]
Отредактировано, потому что я понял, что я использовал синтаксис SQL Server, который, как я думаю, не работает в MySQL.