Имя: Пароль:
1C
1С v8
Задачи по языку запросов
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) К сожалению нет, но я бы посмотрел. Задачи интересные.
Ошибка? Это не ошибка, это системная функция.