在SQL中为每个变量生成日期序列

时间:2018-11-07 22:30:39

标签: sql postgresql

我有一个包含三个食谱的表格,这些食谱的日期显示在菜单上:

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中,如何为每个recipe_id变量生成一个包含一系列从最小值开始的日期的表?这是CROSS JOIN吗?

2 个答案:

答案 0 :(得分:1)

在PostgreSql中,您实际上可以通过递归CTE

获得这些日期。

在SQL Fiddle上测试here

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;

答案 1 :(得分:0)

在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;