如何从Products表筛选日价格涨幅超10%的产品数据
问题描述
我有一张每日更新产品价格的Products表,表结构及数据如下:
| eff_date | product_id | price |
|---|---|---|
| 2022-11-25 | P1 | 150 |
| 2022-11-25 | P2 | 75.8 |
| 2022-11-25 | P3 | 2.9 |
| 2022-11-26 | P1 | 180.5 |
| 2022-11-26 | P2 | 77 |
| 2022-11-26 | P4 | 13.92 |
部分产品并非每日都有数据(比如P3没有26日的数据,P4没有25日的数据)。假设今日是2022-11-26,需要对比产品今日与昨日的价格,筛选出价格涨幅≥10%的产品,输出格式如下:
| eff_date | product_id | todays_price | yesterdays_price |
|---|---|---|---|
| 2022-11-26 | P1 | 180.5 | 150 |
解决方案
可以通过自连接关联今日和昨日的产品价格数据,计算涨幅后筛选符合条件的记录,SQL语句如下:
SELECT t.eff_date, t.product_id, t.price AS todays_price, y.price AS yesterdays_price FROM Products t INNER JOIN Products y ON t.product_id = y.product_id AND t.eff_date = '2022-11-26' AND y.eff_date = DATE_SUB(t.eff_date, INTERVAL 1 DAY) WHERE (t.price - y.price) / y.price >= 0.1;
说明
- 用
INNER JOIN确保只获取两天都有价格记录的产品,避免因某一天无数据导致的无效计算 - 通过
DATE_SUB自动计算昨日日期,比直接写死日期更灵活(如果需要适配任意日期,可替换'2022-11-26'为当前日期函数,比如CURDATE()) - 涨幅计算公式为
(今日价格 - 昨日价格)/昨日价格,筛选结果≥10%(即0.1)的记录
内容的提问来源于stack exchange,提问作者Johny
相关产品推荐
相关产品推荐

