Maison >base de données >tutoriel mysql >Comment puis-je rechercher efficacement les anomalies de données entre les lignes adjacentes dans PostgreSQL à l'aide des fonctions de fenêtre ?

Comment puis-je rechercher efficacement les anomalies de données entre les lignes adjacentes dans PostgreSQL à l'aide des fonctions de fenêtre ?

DDD
DDDoriginal
2024-12-26 12:43:13542parcourir

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

Récupération des résultats en comparant la ligne actuelle avec les lignes adjacentes dans PostgreSQL

Dans PostgreSQL, trouver des corrélations et des anomalies entre des lignes adjacentes nécessite une approche spécifique. Un tel exemple consiste à identifier des nombres impairs pris en sandwich entre des nombres pairs. Implémentez cette logique efficacement en tirant parti des fonctions de fenêtre.

Le concept utilise des fonctions de décalage et d'avance, qui extraient respectivement les valeurs précédentes et suivantes d'un décalage spécifié par rapport à la ligne actuelle. Voici une solution raffinée utilisant ces fonctions :

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

Dans cette requête, la fonction de fenêtre 'w' est définie dans la sous-requête, partitionnant les données par 'textBlockId' et 'sentence' tout en les ordonnant par 'textBlockId' », « phrase » et « position ». Par conséquent, pour chaque ligne, 'previousCategory' contient la catégorie de la ligne précédente, et 'nextCategory' contient la catégorie de la ligne suivante.

Nous filtrons les résultats en vérifiant si la catégorie de la ligne actuelle est différente de ' NAME' tandis que 'previousCategory' et 'nextCategory' correspondent à 'NAME'. Cela nous permet d'identifier les mots sans nom flanqués de catégories de noms.

Alternativement, nous pouvons simplifier la requête :

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';

Dans l'ensemble, l'utilisation des fonctions de fenêtre offre un moyen efficace de comparer les lignes adjacentes. dans PostgreSQL, permettant l'identification de modèles de séquence ou d'anomalies spécifiques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn