programing

MariaDB - 다른 열 값에 따라 상수로 열 업데이트

lastmoon 2023. 6. 6. 10:32
반응형

MariaDB - 다른 열 값에 따라 상수로 열 업데이트

테이블 이름을 내 테이블로 지정했는데 다음과 같이 생겼다고 가정해 보겠습니다.

여기에 이미지 설명 입력

나는 39에 추가된 p6 열의 모든 레코드를 업데이트할 수 있지만 p2 값이 다른 행에 대해서만 업데이트할 수 있기를 원합니다.즉, 결과 테이블은 다음과 같이 표시되어야 합니다.

여기에 이미지 설명 입력

회색인 모든 p2 셀이 동일한 값이기 때문에 이동하면 안 되는 위치를 나타내기 위해 p6 행을 노란색으로 칠했습니다.녹색 p6 행이 증가해야 합니다. p2도 증가하기 때문에 +39를 모든 행에 추가합니다.예제의 마지막 13번째 행은 12행의 p2 = 13행의 p2이기 때문에 다시 노란색입니다.

Gordon Linoff의 도움으로 저는 다음과 같은 일을 할 수 있었습니다.

update mytable join
       (select mytable.*,
               (lag(p6) over(ORDER BY dt) +
                (case when lag(p2) over (order by dt) <> p2 then 39 ELSE 0 end)
               ) as new_p6
        from mytable
       ) tt
       on tt.id = mytable.id 
    set mytable.p6 = tt.new_p6
    where new_p6 <> mytable.p6;

하지만 예상대로 업데이트가 되지 않습니다.제가 그것을 하는 것을 도와주실 수 있나요?

데이터로 업데이트:

id  dt  p2  p6
3   11.2.2021 15:45 536107.56   0
4   11.2.2021 15:50 536107.56   0
5   11.2.2021 15:55 536107.56   0
6   11.2.2021 16:00 536107.56   0
7   11.2.2021 16:05 536107.56   0
8   11.2.2021 16:10 609103.75   39
9   11.2.2021 16:15 609129.81   78
10  11.2.2021 16:20 609155.94   117
11  11.2.2021 16:25 609181.81   156
12  11.2.2021 16:30 609208.06   195
13  11.2.2021 16:35 609208.06   195

변경 사항을 열거하고 39를 곱하려면 다소 다른 논리를 사용해야 합니다.

update mytable 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 mytable tt
             ) tt
       ) tt
       on tt.id = mytable.id 
    set mytable.p6 = cnt * 39
    where cnt > 0;

언급URL : https://stackoverflow.com/questions/66547864/mariadb-update-column-with-constant-depending-on-another-column-values

반응형