gpt4 book ai didi

MYSQL 查询 - 获取价格发生变化的行

转载 作者:行者123 更新时间:2023-11-29 02:49:35 33 4
gpt4 key购买 nike

我有两个表,即。订单和订单项。订单表包含日期,订单项表包含该订单的数量和价格。我想找到价格发生变化的日期。例如,今天的价格是 10,2 天后它变成 11,然后在接下来的 5 天保持 11,然后在 5 天后再次变成 10,所以结果将是 3 个日期 10、11、10,日期将是价格变了

        Date                     price

'2015-04-29 14:48:23', 15.99
'2015-04-30 14:20:11', 15.99
'2015-04-30 21:05:11', 15.99
'2015-05-04 01:41:12', 15.99
'2015-07-28 05:52:20', 15.99
'2015-07-29 16:55:48', 15.99
'2015-08-01 00:31:53', 15.99
'2015-08-15 22:41:49', 15.99
'2015-08-17 02:37:43', 15.99
'2015-08-17 13:28:03', 15.99
'2015-08-23 04:16:31', 15.99
'2015-08-27 08:43:48', 15.99
'2015-08-28 18:42:27', 15.99
'2015-08-29 15:47:17', 15.99
'2015-08-30 03:33:15', 15.99
'2015-10-29 03:45:25', 15.99
'2015-10-29 18:24:20', 15.99
'2015-10-30 18:17:18', 15.99
'2015-11-02 15:28:16', 16.99
'2015-11-03 01:59:03', 16.99
'2015-11-14 18:22:39', 16.99
'2015-11-20 02:48:59', 16.99
'2015-12-16 18:59:54', 16.99
'2015-12-28 04:08:22', 16.99
'2016-01-12 03:21:35', 16.99
'2016-01-18 00:43:56', 16.99
'2016-01-18 20:11:23', 16.99
'2016-02-10 19:07:57', 16.99
'2016-02-26 14:24:29', 16.99
'2016-03-28 10:17:24', 16.99
'2016-03-31 23:33:53', 16.99
'2016-04-01 20:03:03', 17.99
'2016-05-31 20:30:50', 15.99

我想获取所有价格已更改的日期。这里的输出会是

        '2015-04-29 14:48:23',  15.99
'2015-11-02 15:28:16', 16.99
'2016-04-01 20:03:03', 17.99
'2016-05-31 20:30:50', 15.99

即显示价格更改的日期。

到目前为止,我已经编写了这个 MYSQL 查询,但它提供了所有行并且不过滤结果:

         SELECT date, price FROM orderitem
inner join orders o1 on o1.orderid = orderitem.orderid
where productname = 'IBC'
and price <> (
select price from orderitem
inner join orders on orders.orderid = orderitem.orderid
where orders.date< o1.date
order by date desc
limit 1
)

如有任何建议,我们将不胜感激。

最佳答案

对于这样的事情,您需要两次传递,因为您要将每一行与之前的行进行比较。

这样做的一种方法是首先:

SET @lastprice = 0.0;

然后,您的“第一关”将如下所示:

SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
FROM `tablename` ORDER BY `Date` ASC;

这里的顺序很重要,因为您想要构建一个按时间顺序排列的时间表。

然后,您需要做的就是从此结果中检索新旧价格不同的行。像这样的事情会做:

SELECT * FROM ("Above subquery here") `tmp` WHERE `oldprice` != `newprice`;

您的最终查询将如下所示:

SET @lastprice = 0.0;
SELECT * FROM (
SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
FORM `tablename` ORDER BY `Date` ASC
) `tmp`
WHERE `oldprice` != `newprice`;

或者,您可能更喜欢使用临时表来存储子查询结果。在那种情况下,它看起来像这样:

SET @lastprice = 0.0;
CREATE TEMPORARY TABLE `tmp`
SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
FROM `tablename` ORDER BY `Date` ASC;
SELECT * FROM `tmp` WHERE `oldprice` != `newprice`;
DROP TEMPORARY TABLE `tmp`;

具体的实现方式取决于您,但这是一种很好的实现方式。

关于MYSQL 查询 - 获取价格发生变化的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37655513/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com