2017-08-31 81 views
0

我有一个数据库表的格式如下几行的行:计算数量的不同

id | date | position | change_id 
1 | 2013-05-14 | 1 | 1 
2 | 2013-05-14 | 2 | 2 
3 | 2013-05-14 | 2 | 3 

4 | 2013-05-15 | 2 | 1 <--- changed from prev day 
5 | 2013-05-15 | 1 | 2 <--- changed from prev day 
6 | 2013-05-15 | 2 | 3 

7 | 2013-05-16 | 2 | 1 <--- not changed from prev day 
8 | 2013-05-16 | 1 | 2 <--- not changed from prev day 
9 | 2013-05-16 | 2 | 3 <--- not changed from prev day 

什么我希望做的是计算有多少排在position列的条款已修改在这两个日期之间已经发生,即在该示例中,我想获得position2013-05-162013-05-15之间不同的次数。该值将为0,因为position值未更改。

但是如果我想使用的日期2013-05-152013-05-14然后计数将是2,因为位置值已经改变两倍(如图所示)

可以这样在单个查询来完成,或者我会需要做一些处理服务器端?

感谢

+0

你能澄清每个字段之间的关系吗? – ishegg

+0

每天有3行,'changes'的值可以每天更改。所以我需要得到'changes'列不同的行数,也就是说,如果2行已经改变('changes'不同于前一天),那么count就是2等等。所以我只需要来计算两个日期之间的变化次数,即有多少行已经改变(不是“更改”列的总和) –

+0

如果你放一个更大的例子,我认为更好。现在,但导致'1',所以我们不能理解所有的情况。阅读您的评论最多有3行日期?所以结果应该是'{0,1,2}?也不清楚如果更改是在同一天或不同的日子之间 –

回答

0

SQL DEMO

SELECT r1.`date`, 
     SUM(CASE WHEN r1.`position` != r2.`position` 
       THEN 1 
       ELSE 0 
      END) as daily_changes 
FROM `rankings` r1 
LEFT JOIN `rankings` r2 
    ON r1.`date` = r2.`date` + 1 
AND r1.`change_id` = r2.`change_id` 
GROUP BY r1.`date` 

OUTPUT

enter image description here

+0

嗨。使用上面的示例如果我具有所有相同的更改,则获得3.如果我具有所有不同的值,则更改为columb –

+0

示例:http://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle= 90afd199d2dc0e9dfbab54a54ea1cbf7 –

+0

检查这一个http://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=b065bea74c18bd3cafed455ab76f115c'第14天= 0',因为没有前一天。你有没有分组的数据,所以你可以调试源。并且你有最后的小组和我想要的结果。 –

0

选择日期,MAX从X GROUP(变化)的日期

(或者COUNT的变化 - 不知道你需要什么给定的问题)

+0

我需要知道有多少行已更改。所以在上面的例子中,每个日期有3行。其中2个已经改变(我需要这个值)。我需要计算他们有多少人已经改变(我的数据库中有超过3行) –