Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помогите с запросом - диапазон чисел в таблицу  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1209
Есть табличка в которой храниться информация по выданным клиенту пачке(ID_Pack) карточек. Указывается диапазон номеров, который выдан - поля FirstNumber и LastNumber.
Есть таблица, в которой заносится каждая карточка со своим номером, номером пачки и когда использована. (CardNumber, ID_Pack, UseDate)
Реально построить запрос, чтоб получить номера карточек, которые еще не были использованы?
Я так понимаю, что из полей FirstNumber и LastNumber надо как-то временную таблицу сварганить, но как?
7 ноя 13, 14:16    [15090989]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
aleks2
Guest
minva
Реально построить запрос, чтоб получить номера карточек, которые еще не были использованы?

Реально.
Как тока вы скажете, что является признаком "карточки, которая еще не была использована".
7 ноя 13, 15:25    [15091441]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
Престарелый заяц
Guest
Declare @D table(Id int identity( 1, 1 ),NStart int, NEnd int)
Declare @Vid table(Id int, Num int)

Insert into @D values
(1,10),
(50,100)

Insert into @Vid Values
(1, 5),
(1 ,7),
(2, 55),
(2, 56)


;With cte as
(
Select  Id, Nstart as Num,NEnd from @D
union all
Select Id, Num + 1 Num,NEnd from CTE where Num+1<=NEnd
)
select Id,Num from cte
where Num not in (select Num from @Vid v Where v.Id = cte.Id)
order by Id,Num


Где то так ?
7 ноя 13, 15:28    [15091477]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1209
aleks2, её номера нет в таблице использованных
7 ноя 13, 15:36    [15091596]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1209
Престарелый заяц, спасибо!
7 ноя 13, 15:39    [15091646]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1209
Престарелый заяц,
А можно немного пояснить как это работает?
пусть
Insert into @D values
(1,10),
(1,20)


Делаю запрос
select Id,Num,NEnd from cte


получаю
1,1,10
2,1,20
2,2,20
2,3,20
....
1,2,10
...

первые две строки понятно откуда взялись, в вот почему третья начинается с ID=2, а не с 1?
7 ноя 13, 15:59    [15091896]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
Гость333
Member

Откуда:
Сообщений: 3683
minva
первые две строки понятно откуда взялись, в вот почему третья начинается с ID=2, а не с 1?

Если в запросе нет ORDER BY, то порядок выдачи строк не гарантирован и теоретически может быть любым.
7 ноя 13, 16:03    [15091940]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
aleks2
Guest
Престарелым зайцам пора на пензию.
Declare @D table(Id int identity( 1, 1 ),NStart int, NEnd int)
Declare @Vid table(Id int, Num int)

Insert into @D values
(1,10),
(50,100)

Insert into @Vid Values
(1, 5),
(1 ,7),
(2, 55),
(2, 56)
;
with
x as ( 
select Num from @Vid v1 
  where not exists(select * from @Vid v2 where v2.Num = v1.Num +1 )
        and v1.Num < (select max(Num) from @Vid)
union         
select Num from @Vid v1 
  where not exists(select * from @Vid v2 where v2.Num = v1.Num -1 )
        and v1.Num > (select min(Num) from @Vid)
),
y as (select *, ROW_NUMBER() over(Order by Num) n from x)
select y1.Num+1 [from], y2.Num-1 [to] from y y1 inner join y y2 on y1.n+1 = y2.n
7 ноя 13, 16:16    [15092097]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
Престарелый заяц
Guest
2Aleks Вы, вроде бы, немного не то выбираете не то, что нужно ТС.
7 ноя 13, 19:03    [15093391]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
Добрый Э - Эх
Guest
minva,

По сути, классическая задача. :)
Решается посредством преобразования интервалов в точки, с последующим собиранием из точек новых интервалов. Если версия сервера позволяет, то LEAD/LAG тут будет очень к месту.
8 ноя 13, 05:26    [15095024]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
aleks2
Guest
Престарелый заяц
2Aleks Вы, вроде бы, немного не то выбираете не то, что нужно ТС.

Я выбираю лучше.
Тредстартер просто ишо не дорос до понимания.
8 ноя 13, 06:44    [15095077]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
aleks2
Престарелый заяц
2Aleks Вы, вроде бы, немного не то выбираете не то, что нужно ТС.

Я выбираю лучше.
Тредстартер просто ишо не дорос до понимания.

Я бы не был столь категоричен. Постановка задачи ТС ("Реально построить запрос, чтоб получить номера карточек, которые еще не были использованы?") допускают двоякое толкование. Если учесть что существует таблица ВЫДАННЫХ диапазонов то толкование Престарелого Зайца более вероятно.ИМХО
8 ноя 13, 07:13    [15095094]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом - диапазон чисел в таблицу  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1209
LexusR, вы правы. Заяц сделал именно то, что нужно. Тем более я потом уточнил, задачу.
8 ноя 13, 09:45    [15095447]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить