![]() |
![]() |
|
Задачи по языку запросов | ☑ | ||
---|---|---|---|---|
0
DimoXa_
ReIncarnation 20.02.17
✎
13:21
|
Доброго времени суток, камрады. В который раз прошу вашей помощи в каверзном вопросе.
Сейчас нахожусь в процессе поиска работы, и уже на котором собеседовании спотыкаюсь на одной и той же задаче, а именно: Требуется написать запрос, который возвращает таблицу интервалов отсортированной последовательности кодов (по возрастанию) (последовательно идущие коды (шаг +1) объединить в интервал) -код начала последовательности -код конца последовательности пример: 1,2,3,4,5,7,8,9,12,15,16 результат : 1-5 7-9 12 15-16 Задача попадается не в первый раз, поэтому мне кажется, что это из какого-то сборника. Подскажите пожалуйста, где это можно посмотреть. Также буду безмерно благодарен за решение, если вдруг у кого-то есть. Статью с инфостарта по интервалам не предлогать - уже попробовал и не сработало)) Всем заранее благодарен, комарадос. |
|||
1
Лефмихалыч
20.02.17
✎
13:26
|
сначала соединить саму с собой по условию "<", потом выбрать все, у которых Одно минус другое равно один, потом - минимум/максимум
следующий! |
|||
2
DimoXa_
ReIncarnation 20.02.17
✎
13:29
|
(1) Спасибо большое. А про минимум/максимум можно поподробнее? И это же какая-то типовая задача?
|
|||
3
Лефмихалыч
20.02.17
✎
13:33
|
(2) тебе рано еще такие задачи решать - ты языка запросов не знаешь абсолютно
|
|||
4
Лефмихалыч
20.02.17
✎
13:35
|
начни с более простых вещей. Например
- посчитать количество банковских дней между датами А и В. - срез последних на каждую дату |
|||
5
DimoXa_
ReIncarnation 20.02.17
✎
13:39
|
(3) Хорошо, пусть я его не знаю. Но Вы то, Лев Михайлович, наверняка его знаете? Так почему бы просто не объяснить, как это сделать. С вас не убудет же. А меня просветите.
|
|||
6
bolobol
20.02.17
✎
13:52
|
(5) Тут самому понять зачастую сложно, по пять раз переписываешь заново, а вы объяснить просите))
|
|||
7
DimoXa_
ReIncarnation 20.02.17
✎
13:54
|
(6) Ну на уровне "Это сюда забомби, а потом туда зафигач" это ж и я понимаю. Мне не хватает знаний, чтобы это конкретизировать. Вот и прошу помощи у заведомо более компетентных в этом вопросе людей.
|
|||
8
bolobol
20.02.17
✎
13:57
|
(7) Так на уровне таком в (1) написано. Дальше вникать и писаать!
|
|||
9
dubraver
20.02.17
✎
14:43
|
Решение на T-SQL:
DECLARE @t1 TABLE ( code INT ) INSERT INTO @t1 SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 12 UNION SELECT 15 UNION SELECT 16 SELECT Max(t1.code) AS code1, t2.code AS code2 FROM (SELECT t1.code FROM @t1 t1 LEFT JOIN @t1 t2 ON t1.code - 1 = t2.code WHERE t2.code IS NULL) t1 LEFT JOIN (SELECT t1.code FROM @t1 t1 LEFT JOIN @t1 t2 ON t1.code + 1 = t2.code WHERE t2.code IS NULL) t2 ON t1.code <= t2.code GROUP BY t2.code Результат: code1 code2 ----------- ----------- 1 5 7 9 12 12 15 16 |
|||
10
Лефмихалыч
20.02.17
✎
14:43
|
(5) потому, что это просто ни хрена не просто и просто ни хрена не поймешь из моих объяснений без базовых знаний
|
|||
11
DimoXa_
ReIncarnation 20.02.17
✎
14:54
|
(10) Допустим. Я свел это все в таблицу интервалов вида -
НачалоИнтервала КонецИнтервала 1 2 2 3 3 4 4 5 7 8 8 9 15 16 И что дальше? Я именно тут застрял, не могу я в максимум/минимум. Объясните пожалуйста, раз уж вы понимаете и знаете это так хорошо. А то у меня уже складывается впечатление, что вы просто глумитесь. |
|||
12
Лефмихалыч
20.02.17
✎
14:58
|
(11) ну, не без этого
|
|||
13
dubraver
20.02.17
✎
14:59
|
Перевел в 1С запрос:
ВЫБРАТЬ 1 КАК Интервал ПОМЕСТИТЬ t1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9 ОБЪЕДИНИТЬ ВЫБРАТЬ 12 ОБЪЕДИНИТЬ ВЫБРАТЬ 15 ОБЪЕДИНИТЬ ВЫБРАТЬ 16 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МАКСИМУМ(t1.Интервал) КАК Интервал1, t2.Интервал КАК Интервал2 ИЗ (ВЫБРАТЬ t1.Интервал КАК Интервал ИЗ t1 КАК t1 ЛЕВОЕ СОЕДИНЕНИЕ t1 КАК t2 ПО (t1.Интервал - 1 = t2.Интервал) ГДЕ t2.Интервал ЕСТЬ NULL ) КАК t1 ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ t1.Интервал КАК Интервал ИЗ t1 КАК t1 ЛЕВОЕ СОЕДИНЕНИЕ t1 КАК t2 ПО (t1.Интервал + 1 = t2.Интервал) ГДЕ t2.Интервал ЕСТЬ NULL ) КАК t2 ПО t1.Интервал <= t2.Интервал СГРУППИРОВАТЬ ПО t2.Интервал |
|||
14
DimoXa_
ReIncarnation 20.02.17
✎
15:00
|
(13) Спасибо, сейчас опробуем)
|
|||
15
DimoXa_
ReIncarnation 20.02.17
✎
15:08
|
(13) Блин, от души братишка, все отлично заработало. Сейчас переложу на справочник и попробую сделать. Спасибо огромное!!!
|
|||
16
DimoXa_
ReIncarnation 20.02.17
✎
15:21
|
(12) Ну, собственно, можете продолжать в том же духе. Реально знающий человек прислал ответ, а не глумился.
|
|||
17
Said_We
20.02.17
✎
15:44
|
(0) А остальные задачи где?
Сборник нашел? |
|||
18
Ildarovich
20.02.17
✎
15:53
|
Вот отсюда http://catalog.mista.ru/public/306536/ (Задача 14)вот такое решение:
ВЫБРАТЬ
В примере запроса даты, но на числах тоже работает. |
|||
19
DimoXa_
ReIncarnation 20.02.17
✎
15:59
|
(17) К сожалению нет, но я бы посмотрел. Задачи интересные.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |