【问题标题】:Get the first price on each quarter from a pricing table从定价表中获取每个季度的第一个价格
【发布时间】:2021-03-17 10:48:02
【问题描述】:

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

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,price,EXTRACT(YEAR FROM start_date::TIMESTAMP), EXTRACT(QUARTER FROM start_date::TIMESTAMP)

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

谢谢!

【问题讨论】:

    标签: sql postgresql intervals quarter


    【解决方案1】:

    可能有数百种方法可以实现它。您可以首先在 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

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

    SELECT 
      EXTRACT(YEAR FROM d) AS year,
      EXTRACT(QUARTER FROM d) AS quarter
    FROM generate_series('2019-01-01'::DATE,CURRENT_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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多