Postgres中的滚动连接(LOCF)
随着时间的推移,我已经习惯了数据极其有用的功能。这些利用LOCF的运行进行最后的观察。不幸的是,我被迫在一个我不太熟悉使用postgres的环境中工作。SQL中是否有类似的操作,特别是postgres 以下是我所拥有的和我想要的输出的示例: 这是我的第一张桌子Postgres中的滚动连接(LOCF),r,postgresql,data.table,R,Postgresql,Data.table,随着时间的推移,我已经习惯了数据极其有用的功能。这些利用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:
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
下面是我将在data.table中用于所需输出的代码
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,这可能吗?非常感谢您提供的任何帮助。我很想知道是否有人可以在不填充完整交叉联接表的情况下完成此操作。但这里有一个交叉连接的解决方案: 创建架构:
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
EDIT:@Hadley的评论是正确的,因为上面的查询生成的解释和结果与下面的查询相同,所以使用上面的查询永远不会实现完整的交叉连接表:
select t2, max(ind)
from table1
cross join table2
where t1 <= t2
group by t2
由于我在一个特殊的博士后环境中工作,显然它不允许我交叉加入。非常感谢@Clayton Stanley给出了很好的答案,但我不得不尝试另一条路线。到目前为止,它似乎正在发挥作用。我很抱歉不能对这两种方法进行时间比较 创建模式
CREATE TABLE Table1
(`id` int,`t1` double, `ind` int)
;
INSERT INTO Table1
(`id`,`t1`, `ind`)
VALUES
(1,0.99, 5),
(1,1.90, 10),
(2,3.10, 12),
(2,4.00, 3),
(3,5.10, 8),
(3,5.90, 16),
(4,5.90, 7),
(4,5.99, 20)
;
CREATE TABLE Table2
(`id` int, `t2` double)
;
INSERT INTO Table2
(`id`,`t2`)
VALUES
(1,1.00),
(2,3.95),
(3,5.05),
(4,6.01)
;
使用子查询执行联接
select B.*
from Table2 as A
join Table1 as B
on B.id=A.id
join(
select
SUBB.id,
max(SUBB.t1) as t1
from Table2 as SUBA
join Table1 as SUBB
on SUBB.id=SUBA.id and
SUBB.t1 <= SUBA.t2
group by SUBB.id
)
as subqry
on B.t1=subqry.t1 and
A.id=subqry.id
示例架构和输出如下所示:
ind列中的值是什么意思?它只是一个值,用于确认连接是否正确完成。在本例中,is基本上表示行号。如果它只是确认连接正确完成,那么您不能单独使用第二个表吗?列Date中的值相同。我正在尝试将ind列合并到dt2。这可能是对问题的过分简化,但我希望能够在日期合并,即使两个日期完全相等。我希望这些值能继续下去。我很确定postgres从来没有意识到完全连接交叉实际上是默认行为,但是如果你已经设置了一些合理的指标,你会想使用explain来检查这一点,看起来这在这里是可行的。现在,我将尝试更大的数据集,看看它是如何扩展的。谢谢那么这是否意味着永远不会填充完整的交叉连接表呢?@Mike.Gahan至少在PostgreSQL中是这样的,我很确定这是事实。为了测试,我使用了PGAdmin并查看了解释可视化。但真正的测试是在大型数据集上运行查询时。我很想知道进展如何。
select B.*
from Table2 as A
join Table1 as B
on B.id=A.id
join(
select
SUBB.id,
max(SUBB.t1) as t1
from Table2 as SUBA
join Table1 as SUBB
on SUBB.id=SUBA.id and
SUBB.t1 <= SUBA.t2
group by SUBB.id
)
as subqry
on B.t1=subqry.t1 and
A.id=subqry.id