SQL查询,在具有相同名称字段的两行之间找到负面更改

时间:2014-06-05 17:29:36

标签: mysql sql

我有一个包含这样的行的表:(日期,分数,名称) 日期字段有两个可能的日期,并且名称值可能只出现在一个日期下(如果最近添加或删除了该名称)。

我希望获得一个包含如下行的表:( Delta,Name),其中delta是早期和晚期日期之间每个名称的分数变化。另外,只有负面的变化才会让我感兴趣,所以如果Delta> = 0,它根本不会出现在输出表中。

我面临的主要挑战是计算Delta字段。 如标题中所述,它应该是一个SQL查询。

提前感谢您的帮助!

3 个答案:

答案 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支持窗口功能,则不需要这样的技巧。