我有一个包含三个食谱的表格,这些食谱的日期显示在菜单上:
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
吗?
答案 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;