2016-03-07 49 views
1

我正在尝试计算每个帐户的数据集中每条记录之间的日期差异。如何在使用MySQL的变量中存储最后一行的值?

这里的数据,我有

id aid value 
1 1 2015-01-01 
2 1 2015-01-07 
4 1 2015-01-08 
6 1 2015-04-10 
3 2 2015-02-01 
5 2 2015-02-05 

我首先需要的地方,我可以用TIMESTAMPDIFF计算天数的不同组合数据(即TIMESTAMPDIFF(DAY, previousValue, currentValue))。

我怎样才能在数据集中相结合的行约,看起来像这样

aid currentValue previousValue 
1 2015-01-07 2015-01-01 
1 2015-01-08 2015-01-07 
1 2015-04-10 2015-01-08 
2 2015-02-05 2015-02-01 

从那里我可以很容易地计算出当前和以前的值之间的天差。

请注意,我有一个大的数据集,我不能在我的选择中使用子查询,这就是为什么我需要知道如何使用变量来做到这一点。

我最初的数据集如何转换为第二个数据集在那里我有CurrentValue的,PREVIOUSVALUE为每个帐户?

这里是SQL生成上述

CREATE TEMPORARY TABLE lst 
(
    id int, 
    account_id int, 
    value date 
); 


INSERT INTO lst VALUES 
    (1, 1, '2015-01-01') 
, (2, 1, '2015-01-07') 
, (3, 2, '2015-02-01') 
, (4, 1, '2015-01-08') 
, (5, 2, '2015-02-05') 
, (6, 1, '2015-04-10'); 


CREATE TEMPORARY TABLE lst1 AS 
SELECT * FROM lst ORDER BY account_id, value ASC; 

更新了数据表

这是我尝试下面

'1', '2015-01-01', '2015-01-07' 
'1', '2015-01-07', '2015-01-08' 
'1', '2015-02-05', '2015-04-10' 
'2', '2015-01-08', '2015-02-01' 
'2', '2015-02-01', '2015-02-05' 
+0

我认为这是在预期结果的错误,因为它是显示* next *值而不是* previous *之一。 –

+0

你是对的。谢谢你的提示。我只是更新我的问题来纠正预期的数据 –

回答

2

SQL Fiddle

Giorgos Betsos的回答后,得到

的MySQL 5.6架构设置

CREATE TABLE test 
(
    id int, 
    account_id int, 
    value date 
); 


INSERT INTO test VALUES 
    (1, 1, '2015-01-01') 
, (2, 1, '2015-01-07') 
, (3, 2, '2015-02-01') 
, (4, 1, '2015-01-08') 
, (5, 2, '2015-02-05') 
, (6, 1, '2015-04-10'); 

查询1

SELECT 
IF(@accId = account_id, @prevDate, '-') as "Previous Date", 
(@prevDate := value) as "Date", 
(@accId :=account_id) as account_id 
FROM 
test, (SELECT @accId := 0) a, (SELECT @prevDate := '-') b 
ORDER BY account_id ASC, value ASC 

Results

| Previous Date |  Date | account_id | 
    |---------------|------------|------------| 
    |    - | 2015-01-01 |   1 | 
    | 2015-01-01 | 2015-01-07 |   1 | 
    | 2015-01-07 | 2015-01-08 |   1 | 
    | 2015-01-08 | 2015-04-10 |   1 | 
    |    - | 2015-02-01 |   2 | 
    | 2015-02-01 | 2015-02-05 |   2 | 
+0

确实这样做了!非常感谢你。 –

相关问题