Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите разобраться с While  [new]
Pronblra
Member

Откуда:
Сообщений: 10
Всем привет!
Помогите пожалуйста, есть задачка:

Дана таблица с названием Tbl и одним столбцом id int. В последовательности значений в этом столбце есть пропуски. Необходимо одним запросом получить список значений, с которых начинаются пропуски. Например:
Имеем : 1, 2, 4, 7, 22, 23
Должны получить: 3, 5, 8

Понимаю, что принцип решения такой: если разница между текущей и предыдущей цыфрой равно 1 то все нормально, если нет вернуть предыдущее значение +1. Но ни как не могу воплотить.

Кто поможет получит + 100 к карме!!!
18 ноя 15, 23:07    [18438359]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
declare @t table ( id int );

insert into @t
values (1), (2), (4), (7), (22), (23);

select max(id) + 1 as NewVal from
(
select id - row_number() over (order by id) i, id from @t
) t
group by i;
18 ноя 15, 23:18    [18438395]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Pronblra
Member

Откуда:
Сообщений: 10
Knyazev Alexey, спасибо ОГРОМНОЕ!!!!
Если бы ты смог немного пояснить- было бы вообще супер. Просто это еще немного сложно для меня:(
18 ноя 15, 23:26    [18438416]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
MSDN - > Ранжирующие фунции
18 ноя 15, 23:28    [18438424]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Pronblra
Member

Откуда:
Сообщений: 10
Спасибо большое! Обязательно прочту про эти функции!!!

А это единственный способ решить эту задачку?
18 ноя 15, 23:38    [18438456]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Pronblra,

Любую задачу можно решить кучей способов, например завести таблицу-справочник без "дырок" и соединяться с ней
18 ноя 15, 23:42    [18438472]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
либо саму с собой:

select id + 1 as NewVal from @t t
  where not exists ( select * from @t where id - t.id = 1 );
18 ноя 15, 23:44    [18438482]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Pronblra
Member

Откуда:
Сообщений: 10
Knyazev Alexey, начинаю понимать сколько мне еще надо учить))) Еще раз большое спасибо за то, что нашли время чтобы ответить!!!
18 ноя 15, 23:46    [18438492]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Pronblra
Member

Откуда:
Сообщений: 10
Knyazev Alexey,

ООО это намного понятнее!!! клааасс!!! Еще большее спасибо!!!!
18 ноя 15, 23:48    [18438501]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
MTDT
Guest
DECLARE @t TABLE ( id INT );
INSERT INTO @t VALUES (1),(1), (2), (4), (7), (22), (23);
SELECT * FROM (SELECT IIF(LEAD(id) OVER(ORDER BY id) IN (id+1,id),NULL,id+1) rez FROM @t) Z WHERE rez IS NOT NULL
19 ноя 15, 00:00    [18438542]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Pronblra
Member

Откуда:
Сообщений: 10
MTDT, спасибо большое!!! а Вы давно с SQL связаны?)
19 ноя 15, 00:10    [18438577]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Pronblra
Member

Откуда:
Сообщений: 10
Alexey, прошу простить мою непонятливость!) Не могли бы пояснить, а как он считает ID- t.ID= 1? Как он понимает какое из какого значения вычитать? Там же не одна цифра, если он из 1 вычтет 1 получится не 1, но тем не менее этот вариант он в выборке не указывает. Или из 22-7 и т.д. Если не затруднит поясните пожалуйста, а то я мозг сломал уже)
19 ноя 15, 01:06    [18438740]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Pronblra
Alexey, прошу простить мою непонятливость!) Не могли бы пояснить, а как он считает ID- t.ID= 1? Как он понимает какое из какого значения вычитать? Там же не одна цифра, если он из 1 вычтет 1 получится не 1, но тем не менее этот вариант он в выборке не указывает. Или из 22-7 и т.д. Если не затруднит поясните пожалуйста, а то я мозг сломал уже)
Вы не знаете из какого числа нужно вычесть 22 чтобы получить 1?
19 ноя 15, 03:27    [18438800]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pronblra
Не могли бы пояснить, а как он считает ID- t.ID= 1? Как он понимает какое из какого значения вычитать?

Он вычитает из значения в каждой записи. И останавливается на первой, где выполняется условие.
19 ноя 15, 09:19    [18439055]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Pronblra
MTDT, спасибо большое!!! а Вы давно с SQL связаны?)


В точку, ждём объяснений
19 ноя 15, 10:02    [18439225]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Pronblra
Member

Откуда:
Сообщений: 10
Glory, Я сидел, считал вручную, из каждого числа ID вычитал каждое число t.ID и результат 1 получился только у 2 и 23. Я не понимаю как он получился у остальных чисел...Буду очень благодарен, если сможете пояснить!
19 ноя 15, 10:26    [18439367]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pronblra
Я не понимаю как он получился у остальных чисел...

потому что вы забыли сделать NOT exists
19 ноя 15, 10:29    [18439391]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
Pronblra
Glory, Я сидел, считал вручную, из каждого числа ID вычитал каждое число t.ID и результат 1 получился только у 2 и 23. Я не понимаю как он получился у остальных чисел...Буду очень благодарен, если сможете пояснить!
select id + 1 as NewVal from @t t
  where not exists ( select * from @t where id - t.id = 1 );

В этом запросе используются две таблицы - 2 экземпляра таблицы @t

Как выполняется запрос?

Сервер бежит в цикле по записям в первой таблице.

Для каждой записи он делает цикл по всем записям второй таблицы, и вычисляет условие, указанное в части "where id - t.id = 1"

Если "id из первой таблицы" - "id из второй таблицы" равно "1", то он эту запись выводит в результат, если не равно, то переходит к следующей записи в цикле.

Физически это сервером может реализоваться так, может - другими математическими алгоритмами, но логически представляйте работу запросов именно так, хотя бы первое время, пока не научитесь "видеть" запросы сразу, одним взглядом.
Вы увидите, что вам станет невероятно просто понимать работу даже сложных запросов.
19 ноя 15, 10:35    [18439428]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
alexeyvg
он делает цикл по всем записям второй таблицы
Однако, мне кажется принципиальным, что не по всем.
Останавливается на первой подходящей.
19 ноя 15, 10:46    [18439484]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
iap
Однако, мне кажется принципиальным, что не по всем.
В запросе not exists. Поэтому, при отсутствии индекса, по всем.
19 ноя 15, 10:53    [18439533]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
iap
alexeyvg
он делает цикл по всем записям второй таблицы
Однако, мне кажется принципиальным, что не по всем.
Останавливается на первой подходящей.
Ну да, но это уже детали.

Я просто показываю, как вообще читать запросы. Это такой "хинт", для начинающего.

Нам всем тут это кажется очень странным, но люди не понимают, что делает запрос, если в нём более одной таблицы. И иногда даже не понимают, что делает запрос с одной таблицей :-)
Тогда они гуглят примеры с похожим описанием задачи, и показывают их один за другим преподавателю (или начальнику). Те постепенно звереют, и ставят "удовл", когда попадётся похожий пример, что бы больше этого идиота не видеть :-)

Ну а потом уже будет проще понять, чем отличается, например, JOIN от EXISTS.
19 ноя 15, 11:07    [18439631]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
invm
iap
Однако, мне кажется принципиальным, что не по всем.
В запросе not exists. Поэтому, при отсутствии индекса, по всем.
А разве обнаружение первой подходящей записи не приводит сразу же к результату "FALSE"?
Чтобы получить "TRUE", - да, согласен, все записи перебрать придётся.
19 ноя 15, 11:12    [18439668]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
iap
А разве обнаружение первой подходящей записи не приводит сразу же к результату "FALSE"?
Приводит.
Погорячился, был неправ.
19 ноя 15, 11:36    [18439816]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Pronblra
Member

Откуда:
Сообщений: 10
alexeyvg, спасибо Вам большое за подробное разъяснение, я собственно, так и думал, что SQL работает подобным образом. Но когда я считал вручную(благо значений в условии не много), то 1 у меня получился только у 2 и 23, а по идее согласно результату, который выдает запрос, он должен был получиться так же у 4 и 7.
19 ноя 15, 14:21    [18441104]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с While  [new]
Pronblra
Member

Откуда:
Сообщений: 10
Господа! ОГРОМНОЕ всем вам спасибо! Я совсем не ожидал, что такое большое количество людей откликнуться на мою просьбу! Вы все супер!!!
19 ноя 15, 14:22    [18441118]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить