Расширение диапазонов дат в столбце Postgresql - PullRequest
1 голос
/ 07 марта 2012

Этот, вероятно, намного проще, чем я его делаю.Мне нужно запросить таблицу, которая имеет базовый макет, подобный этому

(productNumber varchar, firstYearAvailable int, lastYearAvailable int, ...)

Например

(12345, 2004, 2006, ...),
(22293b, 2009, 2011, ...),
(a7564n, 2007, 2010, ...),
etc.

Эта таблица запрашивается в функции вместе с другими таблицами посредством сложной серии объединений.На данный момент запрос выглядит примерно так:

SELECT field1, field2, productNumber, firstYearAvailable, lastYearAvailable, ...
FROM ...
JOIN ...
WHERE ...
etc.

Вместо того, чтобы возвращать диапазон года для каждого продукта (первый год - прошлый год), для меня было бы более полезно возвращать запись для каждого годадля каждого продукта (первый год, первый год + 1, ..., последний год).Например, скажем, номер продукта был 12345, а диапазон для этого продукта был 2004-2006, тогда запрос должен возвращаться для этого продукта и этих двух столбцов.

(12345,2004),
(12345,2005),
(12345,2006)

Есть еще одна деталь, которая делаетэтот запрос особенно сложен, запрос выполняется по нескольким номерам деталей, и у каждого номера детали может быть свой годовой диапазон.

У кого-нибудь есть какие-либо советы о том, как решить эту проблему?Я дурачился с циклами и объединениями и динамически генерировал оператор SQL с помощью условных выражений, но ни один из них не был эффективен.

Надеюсь, я предоставил достаточно информации, но если нет, просто спросите.

Спасибо

1 Ответ

6 голосов
/ 08 марта 2012

Функция generate_series (начало int, остановка int) ваш ответ:

create temporary table product_years
  (productNumber varchar, firstYearAvailable int, lastYearAvailable int);

insert into product_years values
  ('12345', 2004, 2006),
  ('22293b', 2009, 2011),
  ('a7564n', 2007, 2010);

select
    productNumber,
    generate_series(firstYearAvailable,lastYearAvailable) as productYear
  from product_years;

productnumber | productyear ---------------+------------- 12345 | 2004 12345 | 2005 12345 | 2006 22293b | 2009 22293b | 2010 22293b | 2011 a7564n | 2007 a7564n | 2008 a7564n | 2009 a7564n | 2010 (10 rows)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...