Найти недостающий порядковый номер в базе данных - PullRequest
1 голос
/ 26 ноября 2011

Предположим, что моя структура данных в базе данных такова

ShopId   Transaction

001       1.000    
001       2.000
001       3.000
002       1.000
002       2.000
002       3.000

Теперь возможно, что какая-то транзакция отсутствует, допустим,

002       4.000
002       6.000

В приведенной выше таблице 5.000 транзакция таблицы отсутствует.

Я хочу написать запрос, который найдет отсутствующий порядковый номер, как указано выше, в моей базе данных.

Так что мой запрос вернет результат

   shopid     transaction
   002       5.000

1 Ответ

2 голосов
/ 26 ноября 2011

Чтобы получить количество пропущенных транзакций на ShopId:

  SELECT ShopId
       , count(*) 
           - max([Transaction])
           + min([Transaction])
           - 1 as MissingTranCount
    FROM yourtable
GROUP BY ShopId

Чтобы получить пропущенные транзакции:

1. Создать таблицу № чисел

2.Generate #shops:

  SELECT ShopId as id
    into #shops
    FROM yourtable
GROUP BY ShopId
  HAVING count(*) 
           - max([Transaction])
           + min([Transaction])
           - 1 > 0

3.Получить отсутствующие транзакции:

  SELECT id
       , number
    FROM #numbers
   cross join #shops shops
   WHERE exists (SELECT 1
                   FROM yourtable
                  WHERE ShopId = id
                    and number < [Transaction]
                )
     and exists (SELECT 1
                   FROM yourtable
                  WHERE ShopId = id
                    and number > [Transaction]
                )
     and not exists (SELECT 1
                       FROM yourtable
                      WHERE ShopId = id
                        and number = [Transaction]
                )         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...