mysql 计算价格的有效期

lyfkaqu1  于 2023-01-25  发布在  Mysql
关注(0)|答案(2)|浏览(136)

我有一个table与一个项目,其成本和日期,它是添加。

CREATE TABLE item_prices (
    item_id         INT,
    item_name       VARCHAR(30),
    item_price      DECIMAL(12, 2),
    created_dttm    DATETIME
);

INSERT INTO item_prices(item_id, item_name, item_price, created_dttm) VALUES
(1, 'spoon', 10.20 , '2023-01-01 01:00:00'),
(1, 'spoon', 10.20 , '2023-01-08 01:35:00'),
(1, 'spoon', 10.35 , '2023-01-14 15:00:00'),
(2, 'table', 40.00 , '2023-01-01 01:00:00'),
(2, 'table', 40.00 , '2023-01-03 11:22:00'),
(2, 'table', 41.00 , '2023-01-10 08:28:22'),
(1, 'spoon', 10.35 , '2023-01-28 21:52:00'),
(1, 'spoon', 11.00 , '2023-02-15 16:36:00'),
(2, 'table', 41.00 , '2023-02-16 21:42:11'),
(2, 'table', 45.20 , '2023-02-19 20:25:25'),
(1, 'spoon',  9.00 , '2023-03-02 14:50:00'),
(1, 'spoon',  9.00 , '2023-03-06 16:36:00'),
(1, 'spoon',  8.50 , '2023-03-15 12:00:00'),
(2, 'table', 30    , '2023-03-05 10:10:10'),
(2, 'table', 30    , '2023-03-10 15:45:00');

我需要创建一个包含以下字段的新表:

  • "* 项目标识 *",
  • "* 项目名称 *",
  • "* 项目_价格 *",
  • "* 生效日期 *":价格生效的日期(created_dttm价格记录)
  • "* 有效截止日期 *":此价格有效的截止日期(此产品下一条记录的created_dttm减去一天)

我想它可能是可能的,开始选择的日子上,新的条目添加了新的价格与这样的要求:

SELECT item_id, item_name, item_price, 
       MIN(created_dttm) as dt 
FROM table
GROUP BY item_price, item_id, item_name

它提供了这个输出:

预期输出如下:
| 项目标识|项目名称|项目_价格|有效起始日期|有效至日期|
| - ------|- ------|- ------|- ------|- ------|
| 1个|匙|十时二十分|2023年1月1日|2023年1月13日|
| 1个|匙|十点三十五分|2023年1月14日|2023年2月14日|
| 1个|匙|十一点整|二〇二三年二月十五日|二○二三年三月一日|
| 1个|匙|九点整|二○二三年三月二日|二○二三年三月一日|
| 1个|匙|八点五十分|二〇二三年三月十五日|2023年3月14日|
| 第二章|桌|四十分|2023年1月1日|2022年1月9日|
| 第二章|桌|四十一点整|2023年1月10日|2023年2月18日|
| - -|- -|- -|- -|- -|

bis0qfac

bis0qfac1#

select distinct
   item_id,
   item_name,
   first_value(item_price) over (partition by item_id order by created_dttm) as item_price, 
   min(created_dttm) over (partition by item_id ) as valid_from_dt,
   max(created_dttm) over (partition by item_id ) as valid_to_dt
from item_prices
;

输出:
| 项目标识|项目名称|项目_价格|有效起始日期|有效至日期|
| - ------|- ------|- ------|- ------|- ------|
| 1个|匙|十时二十分|2023年1月1日01时00分|2023年3月15日12时00分|
| 第二章|桌|四十分|2023年1月1日01时00分|2023年3月10日15时45分|
参见:DBFIDDLE

kqqjbcuj

kqqjbcuj2#

您的查询正确。只是缺少下一步:

  • 使用LEAD函数检索分区中的下一个“valid_from_dt
  • 减去1天
WITH cte AS (
    SELECT item_id, item_name, item_price, 
           MIN(created_dttm) AS valid_from_dt
    FROM item_prices
    GROUP BY item_id, item_name, item_price
)
SELECT *, 
       LEAD(valid_from_dt) OVER(PARTITION BY item_id, item_name) - INTERVAL 1 DAY AS valid_to_dt 
FROM cte

检查here演示。

相关问题