随着时间的推移,我已经习惯了data.table在r中滚动连接的非常有用的功能.这些利用了LOCF的操作(最后的观察结果).不幸的是,我被迫在一个我不太熟悉的环境中工作(使用postgres). sql中是否有类似的操作(特别是postgres)?
这是我拥有的一个例子和我想要的输出:
这是我的第一张桌子
dt1 = data.table(Date=seq(from=as.Date("2013-01-03"),to=as.Date("2013-06-27"),by="1 day"),key="Date")[,ind:=.I] Date ind 1: 2013-01-03 1 2: 2013-01-04 2 3: 2013-01-05 3 4: 2013-01-06 4 5: 2013-01-07 5 --- 172: 2013-06-23 172 173: 2013-06-24 173 174: 2013-06-25 174 175: 2013-06-26 175 176: 2013-06-27 176
这是我的第二张桌子
dt2 = data.table(Date=seq(from=as.Date("2013-01-01"),to=as.Date("2013-06-30"),by="1 week"),key="Date") Date 1: 2013-01-01 2: 2013-01-08 3: 2013-01-15 4: 2013-01-22 5: 2013-01-29 --- 22: 2013-05-28 23: 2013-06-04 24: 2013-06-11 25: 2013-06-18 26: 2013-06-25
dt1[dt2,roll=Inf] Date ind 1: 2013-01-01 NA 2: 2013-01-08 6 3: 2013-01-15 13 4: 2013-01-22 20 5: 2013-01-29 27 --- 22: 2013-05-28 146 23: 2013-06-04 153 24: 2013-06-11 160 25: 2013-06-18 167 26: 2013-06-25 174
这甚至可以使用postgres(或更一般地说,sql?非常感谢您提供的任何帮助.
我真的很想知道是否有人可以在不填充完整的交叉连接表的情况下执行此操作.但这是一个交叉连接的解决方案:
http://sqlfiddle.com/#!2/b2f3f/3/0
创建架构:
CREATE TABLE Table1 (`t1` double,`ind` int) ; INSERT INTO Table1 (`t1`,`ind`) VALUES (1,1),(1.9,2),(3.1,3),(4,4),(5.1,5),(5.9,6) ; CREATE TABLE Table2 (`t2` int) ; INSERT INTO Table2 (`t2`) VALUES (1),(2),(3),(4),(5),(6) ;
查询:
select t2,max(ind) from (select t2,ind from table1 cross join table2 where t1 <= t2) as foo group by t2
结果:
T2 MAX(IND) 1 1 2 2 3 2 4 4 5 4 6 6
编辑:@Hadley的评论是正确的,使用上面的查询从未实现完整的交叉连接表,因为上面的查询产生与下面的查询相同的解释和结果:
select t2,max(ind) from table1 cross join table2 where t1 <= t2 group by t2