我有一个包含这样的行的表:(日期,分数,名称) 日期字段有两个可能的日期,并且名称值可能只出现在一个日期下(如果最近添加或删除了该名称)。
我希望获得一个包含如下行的表:( Delta,Name),其中delta是早期和晚期日期之间每个名称的分数变化。另外,只有负面的变化才会让我感兴趣,所以如果Delta> = 0,它根本不会出现在输出表中。
我面临的主要挑战是计算Delta字段。 如标题中所述,它应该是一个SQL查询。
提前感谢您的帮助!
答案 0 :(得分:1)
我假设每个名字都有自己的开始/结束日期。如果整个表格只有两个可能的日期,则可以大大简化。
我在SQL Fiddle here
中尝试了这一点SELECT (score_end - score_start) delta, name_start
FROM
( SELECT date date_start, score score_start, name name_start
FROM t t
WHERE NOT EXISTS
( SELECT 1
FROM t x
WHERE x.date < t.date
AND x.name = t.name
)
) AS start_date_t
JOIN
( SELECT date date_end, score score_end, name name_end
FROM t t
WHERE NOT EXISTS
( SELECT 1
FROM t x
WHERE x.date > t.date
AND x.name = t.name
)
) end_date_t ON start_date_t.name_start = end_date_t.name_end
WHERE score_end-score_start < 0
答案 1 :(得分:0)
假设您有一张date_value, sum_value
的表格
那应该是这样的:
select t.date_value,sum_value,
sum_value - COALESCE((
select top 1 sum_value
from tmp_num
where date_value > t.date_value
order by date_value
),0) as sum_change
from tmp_num as t
order by t.date_value
答案 2 :(得分:0)
以下使用&#34;技巧&#34;在MySQL中,我并不喜欢使用它,因为它将分数转换为字符串然后再转换为数字。但是,这是一种简单的方法来获得你想要的东西:
select t.name, (lastscore - firstscore) as diff
from (select t.name,
substring_index(group_concat(score order by date asc), ',', 1) as firstscore,
substring_index(group_concat(score order by date desc), ',', 1) as lastscore
from table t
group by t.name
) t
where lastscore - firstscore < 0;
如果MySQL支持窗口功能,则不需要这样的技巧。