2010-12-23 35 views
0

我想自己加入一个“未来的自我”表。或者在一周后(或其他任何周期性)附加一列。假设我有一个包含日期,两个标识符和一个值的表格。在查询中,我希望获得该值以及一周后同一组标识的值。SQLite - 自我加入“未来的自我”

对于新手这是两个问题。首先,当我有几个标识符(在真正的问题中,我有六个标识符描述每个日期的唯一条目),我是否应该为该项目创建自己的标识符?其次,我怎么做这一个星期的滞后,特别是在几个月的变化?

下面是一个例子的数据集:

 date id_1 id_2 value value_future 
1 20101224 a c  1   NA 
2 20101224 a d  2   NA 
3 20101224 b c  3   NA 
4 20101224 b d  4   NA 
5 20101225 a c  5   NA 
6 20101225 a d  6   NA 
7 20101225 b c  7   NA 
8 20101225 b d  8   NA 
9 20101226 a c  9   NA 
10 20101226 a d 10   NA 
11 20101226 b c 11   NA 
12 20101226 b d 12   NA 
13 20101227 a c 13   NA 
14 20101227 a d 14   NA 
15 20101227 b c 15   NA 
16 20101227 b d 16   NA 
17 20101228 a c 17   NA 
18 20101228 a d 18   NA 
19 20101228 b c 19   NA 
20 20101228 b d 20   NA 
21 20101229 a c 21   NA 
22 20101229 a d 22   NA 
23 20101229 b c 23   NA 
24 20101229 b d 24   NA 
25 201a c 25   NA 
26 201a d 26   NA 
27 201b c 27   NA 
28 201b d 28   NA 
29 201a c 29   1 
30 201a d 30   2 
31 201b c 31   3 
32 201b d 32   4 
33 20110101 a c 33   5 
34 20110101 a d 34   6 
35 20110101 b c 35   7 
36 20110101 b d 36   8 
37 20110102 a c 37   9 
38 20110102 a d 38   10 
39 20110102 b c 39   11 
40 20110102 b d 40   12 

谢谢!

回答

0

我不太了解SQLLite,所以我不得不查看如何添加日期,但我认为这可能工作。

SELECT c.date, c.id_1, c.id_2, c.value, f.value as value_future 
FROM mytable c 
LEFT OUTER JOIN mytable f 
ON date(c.date, '+7 day') = f.date AND c.id_1 = f.id_1 AND c.id_2 = f.id_2 

基本上你想要做一个连接到相同的表,它要求你在连接(c和f)中别名两个表。使用ON子句中的日期函数可以在一周后加入记录,您可以根据需要调整日期修饰词子句(+7天)以更改日期范围。然后,只需粘贴您拥有的所有标识符。一般来说,创建一个主键是一个好主意,但在这种情况下它不会帮助你,因为没有办法找出你想要加入的记录的关键。最后需要指出的是,您现在在结果中有2个“值”列,因此您需要使用其中一个列来使列列表具有唯一性。这就是“价值未来”所做的。

+0

谢谢!这是答案!但是我的日期是以%Y%m%d的形式出现的。我也可以获取%Y-%m-%d格式的数据,但是有没有办法在db内转换出%Y%m%d?在R中,我会用strptime来做这件事,但这在这里不起作用。谢谢! – 2010-12-23 16:17:04