为每个公司在最后一个条目后生成额外的行

Generate additional row after last entry for each company

提问人:Oren Pinsky 提问时间:11/9/2023 最后编辑:Erwin BrandstetterOren Pinsky 更新时间:11/9/2023 访问量:45

问:

我有一个包含列 , , .datecompanyvalue

日期始终是季度末的日期,因此 2020-12-31、2021-03-31 等。

我需要一个查询,在每家公司最新条目之后的下一个季度显示一个名为“write_off”的布尔值。

例如,如果数据为:

2020-12-31 CompanyA 100
2021-03-31 CompanyA 120
2021-06-30 CompanyA 120

然后,查询应显示:

2020-12-31 CompanyA 100  false
2021-03-31 CompanyA 120  false
2021-06-30 CompanyA 120  false
2021-09-30 CompanyA null true

我试图用它来创建一个“下个季度”行,但我无法让它工作。LEAD()

SQL PostgreSQL 每组 Greatest-n-Per-Group

评论

1赞 Erwin Brandstetter 11/9/2023
实际的表定义(语句)和您的 Postgres 版本会有所帮助。CREATE TABLE
1赞 Erwin Brandstetter 11/9/2023
我冒昧地改写了标题并加强了解释。如果我弄错了,请纠正我。

答:

2赞 Erwin Brandstetter 11/9/2023 #1
SELECT date, company, value, false AS write_off FROM tbl
 
UNION ALL
(  -- parentheses required
SELECT DISTINCT ON (company)
      (date + interval '3 month')::date, company
     , null AS value, true AS write_off
FROM   tbl
ORDER  BY company, date DESC NULLS LAST
);

我们需要额外的括号,否则将应用于整个查询(组合集)。ORDER BYUNION ALL

根据未公开的基数,可能会有更快(优化)的查询变体来获取每个公司的最新行,尤其是在公司很多且每个公司有很多行的情况下。看: