генерировать последовательность дат в SQL для каждой переменной - PullRequest
0 голосов
/ 08 ноября 2018

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

CREATE TABLE recipes (
  recipe_id INT NOT NULL,
  recipe_name VARCHAR(30) NOT NULL,
  recipe_date DATE,
  PRIMARY KEY (recipe_id)
);

INSERT INTO recipes 
    (recipe_id, recipe_name, recipe_date) 
VALUES 
    (1,'Tacos', to_date('2018-09-01', 'YYYY-MM-DD')),
    (2,'Tomato Soup', to_date('2018-10-01', 'YYYY-MM-DD')),
    (3,'Grilled Cheese', to_date('2018-11-01', 'YYYY-MM-DD')),
    (4,'Tacos', to_date('2018-09-03', 'YYYY-MM-DD')),
    (5,'Tomato Soup', to_date('2018-10-07', 'YYYY-MM-DD')),
    (6,'Grilled Cheese', to_date('2018-11-05', 'YYYY-MM-DD'));

Моя цель - создать серию дат с шагом в один день для каждого рецепта min(recipe_date) до date(now()) и, используя это, создайте таблицу из двух столбцов, которая содержит recipe_id и серию дат.

Это означает, что если сегодняшняя дата равна 2018-11-07, то в общей сложности будет 113 строк :

(68 дней для тако, 38 дней для томатного супа и 7 дней для жареного сыра)

Как создать в psql таблицу, содержащую сериюдат, начинающихся с min для каждой переменной recipe_id?Будет ли это с CROSS JOIN?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

В Postgres вы бы использовали generate_series():

select r.recipe_id, gs.dte
from (select recipe_id, min(date) as mind, max(date) as maxd
      from recipes
      group by recipe_id
     ) r cross join lateral
     generate_series(mind, maxd, interval '1 day') as gs(dte)
order by r.recipe_id, gs.dte;
0 голосов
/ 08 ноября 2018

В PostgreSql вы можете получить эти даты через рекурсив CTE

Тест здесь на скрипте SQL.

with RECURSIVE RECIPEDATES (recipe_date, recipe_name) AS
(
  select min(recipe_date), recipe_name
  from recipes
  group by recipe_name

  union all

  select recipe_date + 1, recipe_name
  from RECIPEDATES
  where recipe_date <= current_date
)
select recipe_name, recipe_date
from RECIPEDATES
order by recipe_name, recipe_date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...