SQL: ID x 在日期 y 的状态是什么(有没有更有效的方法?)

标签 sql postgresql date panel

我有两个表:一个包含 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 ,这意味着我想知道在特定日期每个 IDSTATE 是什么。

我的 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/

相关文章:

date - g :formatDate alternative in a service

Php自定义日期格式及比较

javascript - 在 IndexedDB 中保存日期存储一个空对象

mysql - SQL 从 1 x N 中选择,其中都大于

c# - sql连接字符串问题

postgresql - 使用 FOR 循环和 IF 语句更新 Postgresql 中的列

postgresql - 将数据从本地 .CSV 文件复制到远程服务器中的 pgsql 表

c++ - 使用 C++ 或 Qt 将 SQL LIKE 表达式转换为正则表达式

mysql - 如何查找与过滤条件中给定的每个值匹配的所有行?

Django ORM 在 Postgres DB 上留下空闲连接