Имя: Пароль:
1C
1С v8
Как запросом из среза получить период с...по
,
0 Azxcvbn
 
24.05.16
08:15
Есть запрос, который вытаскивает вот такую таблицу

http://i77.fastpic.ru/big/2016/0524/62/0e507c1a2728168788127e2b143df762.png

Есть ли идея как запросом из этой таблицы, сделать вот такую?

http://i78.fastpic.ru/big/2016/0524/89/ed0e7f45d7b0c7a2980afc7044ebe589.png
1 assasu
 
24.05.16
08:16
проще простого
2 Azxcvbn
 
24.05.16
08:16
(1) подскажи
3 assasu
 
24.05.16
08:18
функции для работы с датами есть. их можно использовать в запросе.
4 rphosts
 
24.05.16
08:22
(0) соедини таблицу саму с собой отбирая каждой дате парную дату - минимальную из тех что больше её - получишь все периоды кроме последнего. С последнем реши сам.
5 Лефмихалыч
 
24.05.16
08:27
срез последних на каждую дату
7 Лефмихалыч
 
24.05.16
08:32
не - нахер - холиваров не будет
8 ЛучшийПрограммер1С
 
24.05.16
08:33
9 Тролль главный
 
24.05.16
08:38
(7) вчера полиморфизм норм было
10 ЛучшийПрограммер1С
 
24.05.16
08:44
Ну типа такого кода надо:

ВЫБРАТЬ
    УстановленоНаТС.Период КАК ДатаУстановкиШиныНаТС,
    МИНИМУМ(СнятоСТС.Период) КАК ДатаСнятияШиныСТС
ИЗ
    РегистрСведений.уатАгрегатыТС КАК УстановленоНаТС
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.уатАгрегатыТС КАК СнятоСТС
        ПО УстановленоНаТС.СерияНоменклатуры = СнятоСТС.СерияНоменклатуры
            И УстановленоНаТС.ТС = СнятоСТС.ТС
            И (СнятоСТС.СостояниеАгрегата = ЗНАЧЕНИЕ(Перечисление.уатСостоянияАгрегатов.Снято))
            И (СнятоСТС.Период >= УстановленоНаТС.Период)
ГДЕ
    УстановленоНаТС.СерияНоменклатуры = &Шина
    И УстановленоНаТС.СостояниеАгрегата = ЗНАЧЕНИЕ(Перечисление.уатСостоянияАгрегатов.УстановленоВРаботе)

СГРУППИРОВАТЬ ПО
    УстановленоНаТС.Период

Только у Вас не надо сравнивать на установлено-снято
11 ЛучшийПрограммер1С
 
24.05.16
08:49
Наверное как-то так:

ВЫБРАТЬ
    Период НачалоПериода,
    МИНИМУМ(Конец.Период) КАК ДКонецПериода
ИЗ
    РегистрСведений.Должности КАК ДолжностиС
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Должности КАК ДолжностиПо
        ПО ДолжностиПо.Период > ДолжностиС.Период)

СГРУППИРОВАТЬ ПО
    ДолжностиПо.Период
12 ЛучшийПрограммер1С
 
24.05.16
08:53
Поправил опечатки:

ВЫБРАТЬ
    Период НачалоПериода,
    МИНИМУМ(ДолжностиПо.Период) КАК КонецПериода
ИЗ
    РегистрСведений.Должности КАК ДолжностиС
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Должности КАК ДолжностиПо
        ПО ДолжностиПо.Период > ДолжностиС.Период

СГРУППИРОВАТЬ ПО
    ДолжностиПо.Период
13 ЛучшийПрограммер1С
 
24.05.16
09:00
Хотя вот пишут, что на больших объемах это долго работает и что есть какой-то супер быстрых из 13-ти запросов метод http://catalog.mista.ru/public/402534/
14 Тролль главный
 
24.05.16
09:14
(13) я так понял там ограниченное заранее известное число периодов
15 Ildarovich
 
24.05.16
10:47
(14) Нет, ограничений там особых нет. 13 подзапросов перекрывают интервал анализа 8196 дней - это двадцать пять лет. Но имеет смысл применять, когда для одного сотрудника более сотни интервалов в файловой базе. И 1500 в сиквельной. Иначе классический метод будет быстрее (немного). В статье он, кстати, тоже описан.
16 ЛучшийПрограммер1С
 
24.05.16
11:34
(15) Я немного ошибся - там их не 13, а то ли 33, то ли 34. )
17 Ildarovich
 
24.05.16
12:05
(16) Может и ошиблись, но ответ (случайно?) оказался правильным.
Число минимально необходимых подзапросов рассчитывается как ]Log2(N)[, где N - общая длина анализируемого интервала. В тех единицах, которые интересуют. Если единицы - дни (как в данной теме), то для 25 лет хватит 13 запросов. Если единицы - секунды, то для тех же 25-ти лет хватит 30-ти запросов.
Но! - "Лишние" запросы обрабатывают всего по одной записи и поэтому на быстродействии никак не сказываются. Их можно брать "с запасом", как в статье. Там их 32.
18 Azxcvbn
 
24.05.16
12:07
(13) Вообщем спасибо, у меня все получилось.

Удивительно, что я сразу в гугле не нашел эту тему, неправильно гуглил, оказывается распространенная проблема :)