使用mySQL

时间:2016-10-04 11:40:36

标签: mysql sql sql-order-by

我两天后一直在努力解决问题,我需要帮助。

我想在SQL表中的连续行上进行减法,但是之前要对值进行排序。

例如我有这样的表:

Name       | Activity  |  Day
John | Tennis | Day10
Bob | Swimming | Day9 
Mathilda | Tennis | Day2
John | Swimming | Day2
Bob | Tennis | Day2
John | Computer Science | Day 10

在这张表中,我想知道参加一项以上活动的人是两次活动之间的时间。

所以在这个例子中,如果我们可以减去几天,我们看到约翰和鲍勃有两个活动,他们的最长休息时间由约翰达到8天。

我试过这样做:

SET @previousDay:=0;

SELECT Name, days, @previousDay - day, @previousDay:=day
FROM table
WHERE Name IN (SELECT Name FROM table group by Name having count(Name) > 1) 
ORDER BY Name, Day

但这完全是错误的,因为ORDER BY是在减法之后完成的。我没有看到好的结果,因为我想用连续值进行减法排序。

似乎我无法对IN结果进行排序,所以你知道是否有办法解决我的问题?

非常感谢你的帮助!!!

顺便说一句:我不知道如何正确格式化表格所以任何帮助都将非常感谢!

1 个答案:

答案 0 :(得分:1)

你可以这样做:

select t.*, (previousDay - day) as diff
from (select t.*,
             (@pd := (case when @n <> name
                           then if(@n := name, NULL, NULL) -- does happen
                           when (@tmp_pd := @pd) = null then null       -- never happens
                           when (@pd := day) = null then null   -- never happens
                           else @tmp_pd
                      end)
             ) as previousDay
      from t cross join
           (select @n := '', @pd = -1) params
      order by name, day
     ) t
where previousDay is not null;

请注意,这需要花费大量精力将变量的所有操作放在单个表达式中(因此= NULL条件中的奇怪case。原因是MysQL不保证select子句中表达式的评估顺序,因此可能会以错误的顺序评估多个赋值。