programing

"사이에 아무것도"가 없는 관련 행 찾기

minecode 2022. 11. 30. 21:25
반응형

"사이에 아무것도"가 없는 관련 행 찾기

제 테이블은 다음과 같습니다.

CREATE TABLE mytable (
  id INT(10) auto_increment PRIMARY KEY,
  from DATE(10) NOT NULL,
  before DATE(10) NULL,
  reference_id INT(10) NOT NULL,
)

즉, 다른 테이블을 참조하는 행이 있습니다.reference_id이러한 레퍼런스에는 날짜 범위가 있습니다( )가 있습니다.from/before해당됩니다. 엔트리에 공백이 없는 엔트리가 다수 존재할 수 있습니다.

id | from       | before     | reference_id
-------------------------------------------
1  | 2019-03-01 | 2019-03-05 | 5
5  | 2019-03-05 | 2019-03-09 | 5
8  | 2019-03-09 | NULL       | 5

(다른 엔트리가 있을 수 있습니다.reference_id그 사이에 있습니다.)엔트리는 앞의 엔트리에서 시작합니다.이제 그 사이에 공백이 있는 모든 엔트리를 찾습니다.from보다 늦다before전회의예를 들어 (행의 변경)2,기둥.from):

id | from       | before     | reference_id
-------------------------------------------
1  | 2019-03-01 | 2019-03-05 | 5
5  | 2019-03-06 | 2019-03-09 | 5
8  | 2019-03-09 | NULL       | 5

행 2의from1행보다 하루 늦다before그건 갭이야.문제: 3행과 1행은 동일하지만, 그 사이에 다른 행이 있기 때문에 결과로 간주해서는 안 됩니다.

제가 생각해낸 건 다음과 같습니다.

SELECT *
FROM mytable mt1
INNER JOIN mytable mt2 ON mt1.reference_id = mt2.reference_id AND mt1.id != mt2.id
WHERE mt1.before IS NOT NULL
  AND mt1.from < mt2.from
  AND DATE_ADD(mt1.before, INTERVAL 1 DAY) = mt2.from
  AND NOT EXISTS(SELECT * FROM mytable mt3 WHERE mt3.id BETWEEN mt1.id AND mt2.id)

단, 이(the)는EXISTS)는 매우 느립니다.더 좋은 방법이 있을까요?

[편집] 방금 조회가 끝나서 기대했던 결과가 나오지 않았습니다.그래서 느릴 뿐만 아니라 틀릴 수도 있어요.[/편집]


실행 계획:

1,PRIMARY,mt1,ALL,"mytable_48d78c2b,mytable_261384ee,mytable_849034da",,,,3313021,Using where
1,PRIMARY,mt2,ref,"mytable_48d78c2b,mytable_849034da",mytable_849034da,4,db.mt1.reference_id,1,Using index condition; Using where
2,DEPENDENT SUBQUERY,mt3,index,PRIMARY,mytable_48d78c2b,3,,3313021,Using where; Using index

(주의:from는 예약된 키워드이기 때문에 컬럼 이름으로는 매우 부적절한 선택입니다.하지만, 유효하기 때문에, 이것으로 끝입니다.)

겹침이 없다고 가정하면 지연 함수를 사용하여before이전 행의 경우:lag(before, 1) over (partition by reference_id order by before) as previous_before앞으로 틈이 있는지 확인하기 쉽다면from > previous_before

select
    `from`, before, `reference_id`
  , `from` > lag(before, 1) over (partition by reference_id order by before) as has_gap
from mytable

음, 그건…lag이 경우,before이전 행의 값은 에 의해 결정됩니다.order by창 함수의 절입니다.한다면from이전과 이전이 같기 때문에 틈이 없습니다.

이 쿼리는 앞에 공백이 있는 행을 제공합니다. 리드 함수를 사용하여 뒤에 공백이 있는 행을 가져올 수 있습니다.

MariaDB에는 10.2.2 이후 윈도 기능만 있습니다.

언급URL : https://stackoverflow.com/questions/55296104/find-related-rows-that-have-nothing-in-between-them

반응형