programing

제약 조건이 있는 그룹별 시퀀스 번호 추가

newstyles 2023. 6. 13. 22:02

제약 조건이 있는 그룹별 시퀀스 번호 추가

나는 있습니다Demo테이블

CREATE TABLE `Demo` (
  `id` int(11) NOT NULL,
  `seq` int(11) NOT NULL,
  `old_status` int(11) NOT NULL,
  `new_status` int(11) NOT NULL
)

그리고 데모 데이터

INSERT INTO `Demo` (`id`, `seq`, `old_status`, `new_status`) VALUES
(1, 1, 1, 2),
(1, 2, 2, 3),
(1, 3, 3, 9),
(1, 4, 9, 2),
(1, 5, 2, 3),
(2, 1, 1, 2),
(2, 2, 2, 3);

Demo테이블 모양

이드 seq 오래된 상태 new_status
1 1 1 2
1 2 2 3
1 3 3 9
1 4 9 2
1 5 2 3
2 1 1 2
2 2 2 3

만약 우리가 충족한다면, 나는 그룹별로 버전을 유지하는 열을 추가하고 싶습니다.new_status9 그런 다음 각 그룹별로 이전 값을 하나씩 늘립니다.id예상 결과:

이드 seq 오래된 상태 new_status _버전
1 1 1 2 1
1 2 2 3 1
1 3 3 9 2
1 4 9 2 2
1 5 2 3 2
2 1 1 2 1
2 2 2 3 1

사용하려고 했습니다.LAG내 결과를 얻을 수 있는 기능을 하지만 뭔가 잘못됐어요!

SELECT id, old_status, new_status, 
case 
    when new_status <> 9 then Lag(_version, 1) Over(PARTITION by id ORDER by seq) 
    else Lag(_version, 1) Over(PARTITION by id ORDER by seq) + 1
end _version
from 
(select id, old_status, new_status, 1 as _version, seq
from Demo
order by id, seq) result

계산 방법_version직접 존재하는_version열 또는 다른 접근 방식이 있는지 확인합니다.

계산된 열에서 이 작업을 수행할 수는 없을 것 같습니다. 하지만 사용할 수는 있습니다.SUM()여기서 분석 함수로서:

SELECT *, SUM(new_status = 9) OVER (PARTITION BY id ORDER BY seq) + 1 AS _version
FROM Demo
ORDER BY id, seq;

언급URL : https://stackoverflow.com/questions/71581510/add-sequence-number-by-group-with-constraint