gpt4 book ai didi

Postgres 中的滚动连接 (LOCF)

转载 作者:行者123 更新时间:2023-11-29 11:17:51 25 4
gpt4 key购买 nike

随着时间的推移,我已经习惯了 data.tabler 中滚动连接的非常有用的功能。这些利用 LOCF 的操作(最后的观察结转)。不幸的是,我被迫在一个我不太熟悉的环境中工作(使用 postgres)。 SQL 中是否有类似的操作(特别是 postgres)?

这是我所拥有的以及我想要的输出的示例:

这是我的第一张 table

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

这是我的第二张 table

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)吗?非常感谢您提供的任何帮助。

最佳答案

我真的很有兴趣看看是否有人可以在不首先填充完整的交叉连接表的情况下做到这一点。但这里有一个交叉连接的解决方案:

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

关于Postgres 中的滚动连接 (LOCF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23614639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com