MySQL / MariaDB更新计数器分组

时间:2019-08-22 05:38:21

标签: mysql mariadb

如何更新utf8mb4_hungarian_ci列,使其计数为1,2,3,4,...,然后在另一列number更改时又从1重新开始?

这是到目前为止我得到的:

booking_id

我认为类似这样的方法应该可行,但是我不知道如何SET @pos := 0; SET @last := 0; UPDATE booking_segments SET number = (SELECT @pos := if(booking_id = @last, @pos + 1, 1)), @last := booking_id where 1 ORDER BY booking_id, pickup_time_utc; 在那里烦扰而不会产生语法错误。如果使用MySQL和像JS这样的逗号运算符,我可以做到,但是我不确定@last := booking_id块中还有哪些有效的方法。


我发现了一些东西,但是有没有一种贫民窟的方式呢?

SET

Here's the result,如果您在构图时遇到困难。

SET @pos := 0;
SET @last := 0;

UPDATE booking_segments
SET number = @tmp := (SELECT @pos := if(booking_id = @last, @pos + 1, 1)),
    number = @last := booking_id, 
    number = @tmp
where 1
ORDER BY booking_id,pickup_time_utc ;

我当前使用的版本是10.1.14-MariaDB。

1 个答案:

答案 0 :(得分:1)

MariaDB started supporting Window/Analytic functions since version 10.2;因此,如果可以升级,则可以利用Row_Number()功能。

在派生表中,我们首先可以在booking_id以升序排列的pickup_time_utc分区上获取每一行的“行号”。然后,我们可以联接回到主表,以更新number列。该查询将仅是以下内容:

UPDATE booking_segments AS bs
       JOIN (SELECT id,
                    Row_number()
                      OVER (
                        partition BY booking_id
                        ORDER BY pickup_time_utc ASC) AS rn
             FROM   booking_segments) AS dt
         ON dt.id = bs.id
SET    bs.number = dt.rn