如何解决从定价表中获取每个季度的第一个价格
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] 举报,一经查实,本站将立刻删除。