SQL: Каково состояние идентификатора x на дату y (есть ли более эффективный способ?) - PullRequest
1 голос
/ 31 мая 2011

У меня есть две таблицы: одна содержит список идентификаторов, а другая содержит некоторую информацию об этих идентификаторах, относящуюся ко времени.

пример

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 отсутствует во второй таблице)

Теперь я хочу превратить эту информацию в данные сбалансированной панели , что означает, что я хочу знать, для чего присутствует STATEкаждые ID в определенные даты.

Моя 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
;

Есть ли более эффективный способ?

1 Ответ

1 голос
/ 31 мая 2011

Я не совсем уверен, что получу ваш вопрос, но если вам нужна страница википедии, на которую вы ссылаетесь, то, что вы действительно ищете, ближе к этому:

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 между временем начала и окончания с отметкой времени

...