source

MySQL/MariaDB 업데이트 카운터 그룹 기준

manycodes 2023. 7. 25. 21:10
반응형

MySQL/MariaDB 업데이트 카운터 그룹 기준

업데이트 방법number1,2,3,4,...를 카운트하도록 열을 표시한 후 다른 열이 있을 때 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;

저는 이런 것이 효과가 있어야 한다고 생각합니다만, 저는 그것을 어떻게 회피해야 할지 모르겠습니다.@last := booking_id구문 오류를 만들지 않고 비트를 입력합니다.MySQL과 JS와 같은 쉼표 연산자라면 할 수 있지만 내부에서 어떤 것이 더 유효할지 모르겠습니다.SET블록으로 막다


뭔가 알아냈는데, 이보다 덜 게토적인 방법이 있을까요?

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 ;

이것을 상상하는 데 문제가 있다면 다음과 같은 결과가 있습니다.

+----+------------+--------+---------------------+
| id | booking_id | number | pickup_time_utc     |
+----+------------+--------+---------------------+
| 3  | 2          | 1      | 2015-02-22 18:00:00 |
+----+------------+--------+---------------------+
| 7  | 2          | 2      | 2015-02-23 04:00:00 |
+----+------------+--------+---------------------+
| 8  | 5          | 1      | 2015-06-06 21:00:00 |
+----+------------+--------+---------------------+
| 9  | 5          | 2      | 2015-06-07 08:15:00 |
+----+------------+--------+---------------------+
| 10 | 6          | 1      | 2015-04-11 15:00:00 |
+----+------------+--------+---------------------+
| 11 | 6          | 2      | 2015-04-12 05:30:00 |
+----+------------+--------+---------------------+
| 16 | 8          | 1      | 2015-07-28 08:20:00 |
+----+------------+--------+---------------------+
| 17 | 8          | 2      | 2015-07-28 10:00:00 |
+----+------------+--------+---------------------+
| 18 | 9          | 1      | 2015-07-01 15:50:00 |
+----+------------+--------+---------------------+
| 19 | 10         | 1      | 2015-09-13 06:00:00 |
+----+------------+--------+---------------------+
| 20 | 11         | 1      | 2015-08-01 23:30:00 |
+----+------------+--------+---------------------+
| 21 | 11         | 2      | 2015-08-02 07:00:00 |
+----+------------+--------+---------------------+
| 22 | 12         | 1      | 2015-08-08 20:00:00 |
+----+------------+--------+---------------------+
| 23 | 13         | 1      | 2015-09-05 21:00:00 |
+----+------------+--------+---------------------+
| 24 | 14         | 1      | 2015-09-19 20:30:00 |
+----+------------+--------+---------------------+
| 25 | 15         | 1      | 2015-08-29 21:15:00 |
+----+------------+--------+---------------------+
| 26 | 16         | 1      | 2015-09-10 03:15:00 |
+----+------------+--------+---------------------+
| 37 | 16         | 2      | 2015-09-10 08:00:00 |
+----+------------+--------+---------------------+
| 28 | 17         | 1      | 2015-08-12 22:00:00 |
+----+------------+--------+---------------------+
| 29 | 18         | 1      | 2015-08-11 08:00:00 |
+----+------------+--------+---------------------+
| 30 | 19         | 1      | 2015-08-15 21:00:00 |
+----+------------+--------+---------------------+
| 32 | 20         | 1      | 2016-06-09 09:05:00 |
+----+------------+--------+---------------------+
| 31 | 20         | 2      | 2016-06-10 12:00:00 |
+----+------------+--------+---------------------+
| 33 | 21         | 1      | 2015-09-10 05:00:00 |
+----+------------+--------+---------------------+
| 34 | 22         | 1      | 2015-09-10 02:00:00 |
+----+------------+--------+---------------------+
| 35 | 22         | 2      | 2015-09-10 04:00:00 |
+----+------------+--------+---------------------+
| 36 | 22         | 3      | 2015-09-10 06:45:00 |
+----+------------+--------+---------------------+
| 38 | 23         | 1      | 2015-09-10 04:00:00 |
+----+------------+--------+---------------------+
| 39 | 23         | 2      | 2015-09-10 09:45:00 |
+----+------------+--------+---------------------+
| 40 | 24         | 1      | 2015-09-10 04:30:00 |
+----+------------+--------+---------------------+
| 41 | 24         | 2      | 2015-09-10 06:45:00 |
+----+------------+--------+---------------------+
| 67 | 38         | 1      | 2016-01-02 16:20:00 |
+----+------------+--------+---------------------+
| 68 | 38         | 2      | 2016-01-03 07:00:00 |
+----+------------+--------+---------------------+
| 69 | 38         | 3      | 2016-01-03 10:00:00 |
+----+------------+--------+---------------------+

현재 사용하고 있는 버전은 10.1.14-MariaDB입니다.

MariaDB는 버전 10.2부터 Window/Analytic 기능을 지원하기 시작했으므로 업그레이드가 가능하면 기능을 활용할 수 있습니다.

파생 테이블에서, 우리는 먼저 모든 행에 대한 "행 번호"를 다음의 파티션에서 가져올 수 있습니다.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  

언급URL : https://stackoverflow.com/questions/57602647/mysql-mariadb-update-counter-group-by

반응형