【发布时间】:2021-06-08 05:15:07
【问题描述】:
我有一个名为 dobridol 的表格,其中包含几列。
CREATE TABLE IF NOT EXISTS `dobridol` (
`id` int(6) unsigned NOT NULL,
`dt` varchar(200) NOT NULL,
`p2` int(6) NOT NULL,
`p6` int(6) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `dobridol` (`id`, `dt`, `p2`,`p6`) VALUES
('1', '2021-02-28 23:50:00', '100', '600'),
('2', '2021-02-28 23:55:00', '200', '700'),
('3', '2021-03-01 00:00:00', '300', '800'),
('4', '2021-03-01 00:05:00', '400', '900'),
('5', '2021-03-01 00:10:00', '400', '900'),
('6', '2021-03-01 00:15:00', '400', '900'),
('7', '2021-03-01 00:20:00', '500', '1000'),
('8', '2021-03-01 00:25:00', '600', '1100');
该表还包含一月和三月的值。
我希望能够像这样更新表:
我选择周期为月份,然后我只在 p2 值与前一行 p2 不同时将常量值(在本例中我添加 39)添加到 p6。 如果是这种情况,我必须将 39 添加到 PREVIOUS 行 p6 值。
update dobridol join
(select tt.*,
sum(case when p2 <> prev_p2 then 1 else 0 end) over (order by dt) as cnt
from (select tt.*,
lag(p2) over (order by dt) as prev_p2
from dobridol tt
) tt
) tt
on tt.id = dobridol.id
set dobridol.p6 = cnt * 39 + <PREVIOUS_ROW_p6_VALUE_HAS_TO_BE_HERE>
where cnt > 0
查询应该看起来像这样,但我必须用选择最后一行 p6 的正确语法替换这个
还有在哪里添加子句
dobridol.dt BETWEEN '2021-03-01' AND '2021-03-30'
在 SQL 查询中?
【问题讨论】:
-
以 CREATE TABLE + INSERT INTO 的形式提供示例数据。为一月和三月添加 2-3 行。然后显示指定时期(二月)和常数值(39)的显示源数据的所需输出。 仅当 p2 值与前一行 p2 不同时。 对于最前面的二月行 - 是否必须测试一月最后一行的值?
-
是的,上一月行的值也必须测试
-
使用日期数据类型存储日期,然后返回给我们。
-
sqlfiddle.com/#!9/fa7b9a/2@Strawberry
-
我再次向您推荐我之前的评论。这里没有一月的值。
标签: mysql sql sql-update mariadb