2010-08-25 6 views
3

J'ai une table qui ressemble à quelque chose comme ceci:Interrogation aide nécessaire pour trouver des numéros manquants

ID   | GROUP 
------------------- 
1000001 | 0 
1000001 | 1 
1000001 | 2 
1000002 | 0 
1000002 | 2 
1000002 | 3 
1000003 | 1 
1000003 | 2 
1000003 | 3 
1000004 | 0 

Je dois énumérer tous les ids où il y a un groupe manquant dans la séquence. Donc, pour l'exemple ci-dessus je seulement besoin de retour 1000002 & 1000003.

Merci à l'avance

+0

Cela ne ressemble pas à quelque chose que vous pouvez (peut-être aussi devrait) résoudre dans un SGBD, mais peut-être que je ne connais pas assez l'oracle ^^ – fresskoma

+0

Voulez-vous dire, retourner tous les ID, pour lesquels il y a un groupe k + 1 mais pas de groupe k, k> 0? – user400348

+0

je voulais dire où il y a un groupe k + 1 mais pas de groupe k et aussi si le groupe 0 est manquant @ maxstar – zSynopsis

Répondre

2
select distinct id 
from 
(
    SELECT Id, Group, LAG(Group, 1, -1) over (partition by Id order by Group) prevGroup 
FROM Table 
)  
WHERe Group -1 <> PrevGroup 
+0

Wow, en regardant cette réponse, je me sens comme si je ne connaissais pas du tout le SQL. :) Je n'ai aucune idée de ce que LAG ou partition sont ou comment ils seraient utilisés. – XstreamINsanity

+3

@XstreamINsanity, LAG permet d'accéder à plus d'une ligne d'une table en même temps sans auto-jointure. Étant donné une série de lignes renvoyées à partir d'une requête et une position du curseur, LAG fournit un accès à une ligne à un décalage physique donné avant cette position. Regardez sur http://psoug.org/reference/analytic_functions.html –

+0

Merci, c'est une connaissance pour le futur. – XstreamINsanity

0

Peut-être ceci:

SELECT 
    id 
FROM mytable m 
GROUP BY id 
HAVING (MAX(group) + 1) > COUNT(DISTINCT group); 

(j'ai écrit les clés en minuscules). Si vous avez une clé unique sur (ID, GROUP), vous pouvez omettre le DISTINCT.

+1

peut-être besoin de 'group by id', pas un 'groupe par groupe'? –

+0

lol. Heureux que j'ai vu votre commentaire, a dû aller réparer le mien. :) – XstreamINsanity

+2

@XstreamINsanity, la requête correcte est SELECT ID distinct de la table GROUP BY id HAVING MAX (groupe) + 1> (COUNT (groupe DISTINCT)); –

0

Ce que je veux de vos commentaires est que l'ID doit commencer par un groupe de 0 et le groupe doit toujours augmenter que par 1. De là, je reçois ceci:

SELECT id 
FROM (
     SELECT id, count(*) as cnt, max(group) as mx, min(group) as mn 
     FROM myTable 
     GROUP BY group 
    ) A 
WHERE NOT mx = cnt - 1 
AND NOT mn = 0 

J'espère que cela t'aides. Ce n'est probablement pas le plus propre ou le plus efficace, mais j'espère que cela aidera.

EDIT: En fait, après avoir revu la réponse avant la mienne et penser à avoir, il serait probablement plus propre comme ça.

SELECT ID 
FROM myTable 
GROUP BY ID 
HAVING MAX(group) >= COUNT(DISTINCT group) 
2

Comme nous ne besoin des informations sur le numéro de groupe manquant, nous pouvons comparer que sur tout le nombre d'éléments est inférieur ou égal pour un groupe spécifique

SELECT ID FROM YOUR_TABLE 
GROUP BY ID 
HAVING COUNT(ID) <= max(GROUP); 
+0

+1 Comme le vôtre meilleur que le mien. :) – XstreamINsanity

+0

Merci. '' '' '' –