Требуется помощь в поиске пропущенных номеров - PullRequest
3 голосов
/ 25 августа 2010

У меня есть таблица, которая выглядит примерно так:

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

Мне нужно перечислить все идентификаторы, где в последовательности отсутствует группа.Так что для приведенного выше примера мне понадобится только 1000002 и 1000003.

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 25 августа 2010

Поскольку нам не нужна информация об отсутствующем номере группы, мы можем сравнить, что по всему количеству элементов оно меньше или равно для конкретной группы

SELECT ID FROM YOUR_TABLE
GROUP BY ID 
HAVING COUNT(ID) <= max(GROUP);
2 голосов
/ 25 августа 2010
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 голосов
/ 25 августа 2010

Что я получаю из ваших комментариев, так это то, что идентификатор должен начинаться с группы 0, а группа всегда должна увеличиваться только на 1. Отсюда я получаю следующее:

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

Надеюсь, этопомогает.Это, вероятно, не самый чистый или самый эффективный, но надеюсь, что это поможет.

РЕДАКТИРОВАТЬ: На самом деле, после пересмотра ответа перед моим и размышления о HAVING, это, вероятно, будет чище, как это.

SELECT ID
FROM   myTable
GROUP BY ID
HAVING MAX(group) >= COUNT(DISTINCT group)
0 голосов
/ 25 августа 2010

Может быть, это:

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

(я написал ключи в нижнем регистре). Если у вас есть уникальный ключ на (ID, GROUP), вы можете пропустить DISTINCT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...