我有两个表:一个包含 ID 列表,另一个包含关于这些 ID 的一些时间相关信息。
例子
ID_TABLE
ID
1
2
3
INFO_TABLE
ID START END STATE
1 2000-01-01 2000-01-31 A
1 2000-02-01 2000-03-31 B
3 2000-02-01 2000-02-31 A
3 2000-03-01 2000-05-31 C
(请注意,ID=2 不存在于第二个表中)
现在我想把这个信息变成balanced panel data ,这意味着我想知道在特定日期每个 ID
的 STATE
是什么。
我的 SQL 命令如下所示:
SELECT
id_table.id,
t1.state AS Jan,
t2.state AS Feb,
t3.state AS March
FROM
id_table
LEFT JOIN info_table AS t1
ON id_table.id = t1.id
AND '2000-01-15' BETWEEN t1.start AND t1.end
LEFT JOIN info_table AS t2
ON id_table.id = t2.id
AND '2000-02-15' BETWEEN t2.start AND t2.end
LEFT JOIN info_table AS t3
ON id_table.id = t3.id
AND '2000-03-15' BETWEEN t3.start AND t3.end
;
有没有更高效的方法?
最佳答案
我不完全确定我是否理解你的问题,但如果你链接的维基百科页面可以作为引用,那么你真正要寻找的更接近于此:
select t.id,
'2000-01-01'::date + (m.mon || ' months')::interval as month,
t.state
from generate_series(0, 11) as m (mon)
left join info_table t
on '2000-01-15'::date + (m.mon || ' months')::interval
between t.start and t.end
如果您当前的查询是您实际需要的查询,您可以通过使用几何类型来加快速度:
PostgreSQL matching interval between start and end time against timestamp
关于SQL: ID x 在日期 y 的状态是什么(有没有更有效的方法?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6186457/