微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从定价表中获取每个季度的第一个价格

如何解决从定价表中获取每个季度的第一个价格

我有一个包含以下字段的定价表:

id
start_date
price

我想获取每个季度的首个价格,我该如何实现?

我试过了:

SELECT id,price,EXTRACT(YEAR FROM start_date::TIMESTAMP) AS year,EXTRACT(QUARTER FROM start_date::TIMESTAMP) AS quarter,min(start_date) as start_date
FROM pricing
GROUP BY id,EXTRACT(YEAR FROM start_date::TIMESTAMP),EXTRACT(QUARTER FROM start_date::TIMESTAMP)

但如果价格发生变化,我将获得所有季度价格,我只需要每个季度的第一个价格。

谢谢!

解决方法

可能有数百种方法来实现它。您可以首先在 CTE 或子查询中创建您需要的季度,以便您可以将其与您的定价表进行比较,例如

样本数据

CREATE TEMPORARY TABLE pricing (id INT,start_date DATE,price NUMERIC);
INSERT INTO pricing VALUES 
  (5,CURRENT_DATE,1.99),(4,CURRENT_DATE-2,0.99),(3,CURRENT_DATE-3,0.42),(2,CURRENT_DATE-100,0.10),(1,CURRENT_DATE-121,0.82);

查询

WITH q (year,quarter) AS (
  SELECT DISTINCT
    EXTRACT(YEAR FROM start_date::TIMESTAMP),EXTRACT(QUARTER FROM start_date::TIMESTAMP) 
  FROM pricing
)
SELECT *,(SELECT price 
           FROM pricing 
           WHERE EXTRACT(QUARTER FROM start_date::TIMESTAMP) = q.quarter AND
                 EXTRACT(YEAR FROM start_date::TIMESTAMP) = q.year
           ORDER BY start_date LIMIT 1) 
FROM q ORDER BY q.year,q.quarter;

 year | quarter | price 
------+---------+-------
 2020 |       4 |  0.82
 2021 |       1 |  0.42

演示:db<>fiddle

EDIT:根据您的用例,您可能希望使用类似 generate_series 的东西生成年份和季度,而不是在 pricing 上运行完整扫描,如示例所示上面,例如

SELECT 
  EXTRACT(YEAR FROM d) AS year,EXTRACT(QUARTER FROM d) AS quarter
FROM generate_series('2019-01-01'::DATE,'3 month') AS d
ORDER BY 1,2;

 year | quarter 
------+---------
 2019 |       1
 2019 |       2
 2019 |       3
 2019 |       4
 2020 |       1
 2020 |       2
 2020 |       3
 2020 |       4
 2021 |       1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。