2011-09-10 99 views
6

我想计算同一个表中不同行之间唯一日期字段的差异。在MySQL中选择行日期之间的差异

例如,给出以下数据:

id | date 
    ---+------------ 
    1 | 2011-01-01 
    2 | 2011-01-02 
    3 | 2011-01-15 
    4 | 2011-01-20 
    5 | 2011-01-10 
    6 | 2011-01-30 
    7 | 2011-01-03 

我想生成产生以下的查询:

id | date  | days_since_last 
---+------------+----------------- 
1 | 2011-01-01 | 
2 | 2011-01-02 | 1 
7 | 2011-01-03 | 1 
5 | 2011-01-10 | 7 
3 | 2011-01-15 | 5 
4 | 2011-01-20 | 5 
6 | 2011-01-30 | 10 

什么日期函数我会在MySQL中使用任何建议,或者是否有一个子选择可以做到这一点?

(当然,我不介意把WHERE date > '2011-01-01'忽略的第一行。)

+0

这是它会是不错的是MySQL的支持分析,铅和LAG要具体... –

回答

2

相关子查询可能会有所帮助:

SELECT 
    id, 
    date, 
    DATEDIFF(
    (SELECT MAX(date) FROM atable WHERE date < t.date), 
    date 
) AS days_since_last 
FROM atable AS t 
+0

这会工作,这很好,但是由于嵌套子查询(你会做“n”表扫描)。最好的方法是在日期排序后使用一个变量来存储前一行的日期值 - 并且只做一次。我现在不能被打扰,但如果你想要去... :) – Bohemian

+0

这是我以为我在寻找的东西,但正如波希米亚所说的那样,表现会受到伤害。花了28分钟才完成(约26,000行)。我选择这个作为我的问题的最佳答案,但为了理智,最好使用临时表并遵循Krtek的答案。 –

+0

@Mike S .:我有两件事感到惊讶。首先,我很惊讶它在这么一张小桌子上表现得如此糟糕。请不要误解我的意思,我已经意识到这个解决方案可能不是最快的解决方案,甚至可能会低于平均水平,但在26,000行28分钟内......可能是因为表中没有索引'?无论如何,让我感到惊讶的另一件事是,你首先选择了这个答案。 :)我的意思是我很欣赏它,谢谢,但请相信我,根据您自己的话,我自己现在发现Krtek的答案更接近“正确”的解决方案,不管最终结果如何。 –

0

像这样的东西应该工作:

SELECT mytable.id, mytable.date, DATEDIFF(mytable.date, t2.date) 
FROM mytable 
LEFT JOIN mytable AS t2 ON t2.id = table.id - 1 

然而,这意味着你的id是连续的表,否则这根本不起作用。也许MySQL会抱怨第一行,因为t2.date将是null,但我没有时间现在检查。

+0

你打我的答案,让我'我只是添加我的作品,并建议他看看文档:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff – Tchami

+0

@Krtek,谢谢为快速反应。我必须更新我的问题以更好地反映情况,因为ID不按时间顺序排列。 –

+0

@Tchami - 感谢您的信任投票。 ;)放心,我知道文档的位置,并经常咨询。 –