按顺序检索值并使用 mySQL 减去行
Retrieve value in order and substract rows using mySQL
两天前我一直在为一个问题苦苦挣扎,我需要帮助。
我想对 SQL table 中的连续行进行减法,但要先对值进行排序。
例如我有这样的 table :
Name | Activity | Day
John | Tennis | Day10
Bob | Swimming | Day9
Mathilda | Tennis | Day2
John | Swimming | Day2
Bob | Tennis | Day2
John | Computer Science | Day 10
在这个table中,我想知道获得超过一个的人activity两次活动之间的时间是多少。
所以在这个例子中,如果我们可以减去天数,我们会看到 John 和 Bob 有两个活动,John 达到了他们的最大休息时间 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 结果进行排序,所以您知道是否有办法解决我的问题?
非常感谢您的帮助!!!
顺便说一句:我不知道如何正确格式化 table 所以任何帮助将不胜感激,非常感谢!
你可以这样做:
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;
请注意,这需要付出很大的努力才能将所有变量操作放在一个表达式中(因此 case
条件中的怪异 = NULL
)。原因是 MysQL 不保证 select
子句中表达式的求值顺序,因此多个赋值可能会以错误的顺序求值。
两天前我一直在为一个问题苦苦挣扎,我需要帮助。
我想对 SQL table 中的连续行进行减法,但要先对值进行排序。
例如我有这样的 table :
Name | Activity | Day
John | Tennis | Day10
Bob | Swimming | Day9
Mathilda | Tennis | Day2
John | Swimming | Day2
Bob | Tennis | Day2
John | Computer Science | Day 10
在这个table中,我想知道获得超过一个的人activity两次活动之间的时间是多少。
所以在这个例子中,如果我们可以减去天数,我们会看到 John 和 Bob 有两个活动,John 达到了他们的最大休息时间 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 结果进行排序,所以您知道是否有办法解决我的问题?
非常感谢您的帮助!!!
顺便说一句:我不知道如何正确格式化 table 所以任何帮助将不胜感激,非常感谢!
你可以这样做:
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;
请注意,这需要付出很大的努力才能将所有变量操作放在一个表达式中(因此 case
条件中的怪异 = NULL
)。原因是 MysQL 不保证 select
子句中表达式的求值顺序,因此多个赋值可能会以错误的顺序求值。