(A part: Pourquoi les gens en général (Rahul est pas le seul, loin de l'imagination) omettent le nom de leur table de la question?)
Il est très difficile à faire d'une manière relationnelle car elle repose intrinsèquement sur l'ordonnancement des données et l'algèbre relationnelle fonctionne sur des ensembles (non ordonnés). Je suppose que nous devons supposer qu'il n'y a pas de signification pour la colonne DocID et qu'elle ne peut pas être utilisée pour résoudre le problème.
Dans l'exemple, vous avez S003 et S005 et il manque S004. Comment dit-on qu'il y a une valeur manquante? Vraisemblablement, parce qu'il y a une opération de comparaison qui nous dit «inférieur à», «égal», «supérieur à», et aussi parce qu'il y a une fonction de différence qui nous dit que l'écart entre S003 et S005 est de 2. Supposons que ' > 'et les amis font la comparaison (fonctionne ici pour les chaînes de caractères), et que vous pouvez produire une procédure stockée webid_diff() qui prend deux valeurs WebID et renvoie la différence.
Ensuite, vous pouvez écrire une requête telle que:
SELECT a.webid, MIN(b.webid) AS min_next
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid;
Il utilise un non-équijointure entre la table elle-même et de trouver le minimum successeur valeur CodeWeb pour chaque élément. Avec cela comme le noyau, nous pouvons ensuite filtrer le résultat pour sélectionner uniquement les lignes pour lesquelles l'écart entre WebID et Min_Next est supérieur à un. Donc, je pense que nous obtenons (1ère tentative):
SELECT x.webid, y.min_next, webid_diff(x.webid, y.min_next) AS gap
FROM AnonymousTable AS x,
(SELECT a.webid, MIN(b.webid) AS min_next
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid
) AS y
WHERE x.webid = y.webid
AND webid_diff(x.webid, y.min_next) > 1;
Est-ce la jonction au niveau extérieur nous avoir fait quelque chose d'utile? Je ne pense pas, afin que nous puissions l'enlever, ce qui conduit à (2ème tentative):
SELECT y.webid, y.min_next, webid_diff(y.webid, y.min_next) AS gap
FROM (SELECT a.webid, MIN(b.webid) AS min_next
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid
) AS y
WHERE webid_diff(y.webid, y.min_next) > 1;
Cela ne fonctionne. Essayer de placer la fonction webid_diff() dans la requête interne me pose des problèmes - au moins l'expression de GAP devrait être incluse dans la clause GROUP BY, mais cela donnera une mauvaise réponse.
La clause HAVING est utilisé pour appliquer des conditions de filtre aux agrégats, il semble un peu comme si la requête pourrait être réductible à:
SELECT a.webid, MIN(b.webid) AS min_next, webid_diff(a.webid, b.webid) AS gap
FROM AnonymousTable AS a, AnonymousTable AS b
WHERE a.webid < b.webid
GROUP BY a.webid
HAVING webid_diff(a.webid, b.webid) > 1;
Cependant, cela ne fonctionne pas (pour moi, avec mon SGBD - IBM Informix Dynamic Server) car webid_diff() n'est pas un agrégat.
Voici le code que j'utilisé pour la fonction webid_diff() (vous auriez à ajuster en fonction de la syntaxe de votre SGBD), et la fonction auxilliaire de webid_num():
CREATE FUNCTION webid_num(a CHAR(4)) RETURNING INTEGER;
DEFINE i INTEGER;
LET i = substr(a, 2, 3);
RETURN i;
END FUNCTION;
CREATE FUNCTION webid_diff(a CHAR(4), b CHAR(4)) RETURNING INTEGER;
DEFINE i, j INTEGER;
LET i = webid_num(a);
LET j = webid_num(b);
RETURN (j - i);
END FUNCTION;
Votre commentaire était valide. La question a été clarifiée. Je suggère de supprimer cette réponse pour éviter les votes négatifs. –