【问题标题】:Maria DB - update row with value of previous row + constantMariadb - 使用前一行的值更新行+常量
【发布时间】: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 不同时。 对于最前面的二月行 - 是否必须测试一月最后一行的值?
  • 是的,上一月行的值也必须测试
  • 使用日期数据类型存储日期,然后返回给我们。
  • 我再次向您推荐我之前的评论。这里没有一月的值。

标签: mysql sql sql-update mariadb


【解决方案1】:

如果我理解正确,你可以使用lag()

update dobridol join
       (select tt.*,
               lag(p6) over (order by dt) as prev_p6,
               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 = tt.cnt * 39 + tt.prev_p6
    where cnt > 0 ;

Here 是一个 dbfiddle。

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 2013-01-10
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2021-12-16
    相关资源
    最近更新 更多