generar secuencia de fechas en SQL para cada variable

votos
0

Tengo una tabla con tres recetas y fechas de esas recetas aparecen en el menú:

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'));

Mi objetivo es generar una serie de fechas que se incrementa en un día por cada receta de min(recipe_date)hasta date(now())y usar que crean una tabla de dos columnas que contiene el recipe_idy la serie de fechas.

Esto significa que si la fecha de hoy es 2018-11-07, habrá un total de 113 filas :

(68 días generados para Tacos, 38 días generados para sopa de tomate, y 7 días generados para queso asado)

¿Cómo se podría, en psql, generar una tabla que contiene una serie de fechas a partir de los valores mínimo para cada recipe_idvariable? Sería esto con una CROSS JOIN?

Publicado el 07/11/2018 a las 22:30
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

En PostgreSql en realidad se puede conseguir esas fechas a través de un recursiva CTE

Probar aquí en SQL violín.

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;
Respondida el 07/11/2018 a las 23:11
fuente por usuario

votos
0

En Postgres, utilizaría 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;
Respondida el 08/11/2018 a las 03:25
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more