>데이터 베이스 >MySQL 튜토리얼 >창 함수를 사용하여 PostgreSQL의 인접한 행 사이에서 데이터 이상 현상을 효율적으로 찾으려면 어떻게 해야 합니까?

창 함수를 사용하여 PostgreSQL의 인접한 행 사이에서 데이터 이상 현상을 효율적으로 찾으려면 어떻게 해야 합니까?

DDD
DDD원래의
2024-12-26 12:43:13516검색

How Can I Efficiently Find Data Anomalies Between Adjacent Rows in PostgreSQL Using Window Functions?

PostgreSQL에서 현재 행을 인접 행과 비교하여 결과 검색

PostgreSQL에서 인접 행 간의 상관 관계와 이상 현상을 찾으려면 특정 접근 방식이 필요합니다. 그러한 사례 중 하나는 짝수 사이에 끼어 있는 홀수를 식별하는 것입니다. 창 함수를 활용하여 이 논리를 효율적으로 구현합니다.

이 개념은 현재 행을 기준으로 지정된 오프셋에서 이전 값과 다음 값을 각각 추출하는 지연 및 리드 함수를 사용합니다. 다음은 이러한 함수를 사용하는 세련된 솔루션입니다.

SELECT tokcat.text
FROM (
    SELECT text, category, chartype,
           lag(category,1) OVER w as previousCategory, lead(category,1) OVER w as nextCategory
    FROM token t, textBlockHasToken tb
    WHERE tb.tokenId = t.id
    WINDOW w AS (
        PARTITION BY textBlockId, sentence
        ORDER BY textBlockId, sentence, position
    )
) tokcat
WHERE 'NAME' = previousCategory
AND 'NAME' = nextCategory
AND 'NAME' <> category

이 쿼리에서 창 함수 'w'는 하위 쿼리 내에 정의되어 데이터를 'textBlockId' 및 'sentence'로 분할하고 'textBlockId로 정렬합니다. ', '문장', '위치'입니다. 결과적으로 각 행에 대해 'previousCategory'에는 이전 행의 카테고리가 포함되고, 'nextCategory'에는 후속 행의 카테고리가 포함됩니다.

현재 행의 카테고리가 ''와 다른지 확인하여 결과를 필터링합니다. NAME'이고 'previousCategory'와 'nextCategory'는 모두 'NAME'과 일치합니다. 이를 통해 이름 범주 옆에 있는 이름이 아닌 단어를 식별할 수 있습니다.

또는 쿼리를 단순화할 수 있습니다.

SELECT text
FROM (
    SELECT text, category,
           lag(category) OVER w as previous_cat, lead(category) OVER w as next_cat
    FROM token t
    JOIN textblockhastoken tb ON tb.tokenid = t.id
    WINDOW w AS (PARTITION BY textblockid, sentence ORDER BY position)
) tokcat
WHERE category <> 'NAME'
AND previous_cat = 'NAME'
AND next_cat = 'NAME';

전반적으로 창 함수를 사용하면 인접한 행을 비교하는 효율적인 방법을 제공합니다. PostgreSQL에서 특정 시퀀스 패턴이나 이상 징후를 식별할 수 있습니다.

위 내용은 창 함수를 사용하여 PostgreSQL의 인접한 행 사이에서 데이터 이상 현상을 효율적으로 찾으려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.