Имя: Пароль:
1C
1С v8
Получить запросом кол-во повторяющихся ПОДРЯД записей
0 Sheezo
 
19.04.17
16:38
Добрый день. Можно ли запросом получить кол-во повторяющихся подряд записей? Например, имеются данные из двух полей: 1/ДА, 2/ДА, 3/ДА, 4/НЕТ, 5/НЕТ, 6/ДА, 7/НЕТ. Нужно получить таблицу из кол-ва повторяющихся подряд ДА (3, 1).
1 Вафель
 
19.04.17
16:41
таблица пронумерована?
2 Sheezo
 
19.04.17
16:44
1. Пронумерована

Например:
1  Истина
2  Истина
3  Истина
4  Ложь
5  Истина

На самом деле требуется получить количество явок подряд:
01.01.17   Явка
02.01.17   Явка
03.01.17   Явка
04.01.17   НеЯвка
05.01.17   Явка
3 Sheezo
 
19.04.17
16:47
А в идеале получить следующую таблицу из исходной:

01.01.17   Явка    1
02.01.17   Явка    2
03.01.17   Явка    3
04.01.17   НеЯвка  0
05.01.17   Явка    1
4 Волшебник
 
модератор
19.04.17
16:51
сделай циклом
5 Sheezo
 
19.04.17
16:55
(4) Циклом-то без проблем. Хотелось бы запросом. Да и просто интересная задача.
6 breezee
 
19.04.17
17:29
(5) Сначала я бы выбрал ИМЕЮЩИЕ да, если я правльно понял логику, получились бы максимальные по ДА, потом ИМЕЮЩИЕ НЕТ. Может сработает. А может и нет
7 Волшебник
 
модератор
19.04.17
17:29
(5) сделай циклом и не люби нам мозг
8 breezee
 
19.04.17
17:34
(6) А, не, не прокатит
9 sqr4
 
19.04.17
17:36
ВЫБРАТЬ
    1 КАК Поле1,
    ИСТИНА КАК Поле2
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2,
    ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3,
    ЛОЖЬ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    4,
    ЛОЖЬ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    5,
    ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    6,
    ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    7,
    ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    8,
    ЛОЖЬ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Данные.Поле1,
    Данные.Поле2,
    ДанныеДоп.Поле1 КАК Поле11,
    ДанныеДоп.Поле2 КАК Поле21
ПОМЕСТИТЬ ДанныеНов
ИЗ
    Данные КАК Данные
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Данные КАК ДанныеДоп
        ПО Данные.Поле1 >= ДанныеДоп.Поле1
            И Данные.Поле2 = ДанныеДоп.Поле2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДанныеНов.Поле1,
    ДанныеНов.Поле2,
    МИНИМУМ(ДанныеНов.Поле11) КАК Поле11,
    МАКСИМУМ(ДанныеНов.Поле11) КАК Поле111
ПОМЕСТИТЬ ЕщеОДнаГрупировка
ИЗ
    ДанныеНов КАК ДанныеНов

СГРУППИРОВАТЬ ПО
    ДанныеНов.Поле1,
    ДанныеНов.Поле2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЕщеОДнаГрупировка.Поле1,
    ЕщеОДнаГрупировка.Поле2,
    ЕщеОДнаГрупировка.Поле11,
    ЕщеОДнаГрупировка.Поле111,
    МАКСИМУМ(ЕСТЬNULL(ЕщеОДнаГрупировкаДоп.Поле111, ЕщеОДнаГрупировка.Поле11)) КАК Поле1111
ПОМЕСТИТЬ ЕщеОднаНадеюсьПоследняя
ИЗ
    ЕщеОДнаГрупировка КАК ЕщеОДнаГрупировка
        ЛЕВОЕ СОЕДИНЕНИЕ ЕщеОДнаГрупировка КАК ЕщеОДнаГрупировкаДоп
        ПО ЕщеОДнаГрупировка.Поле2 <> ЕщеОДнаГрупировкаДоп.Поле2
            И ЕщеОДнаГрупировка.Поле111 > ЕщеОДнаГрупировкаДоп.Поле111

СГРУППИРОВАТЬ ПО
    ЕщеОДнаГрупировка.Поле1,
    ЕщеОДнаГрупировка.Поле2,
    ЕщеОДнаГрупировка.Поле11,
    ЕщеОДнаГрупировка.Поле111
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЕщеОднаНадеюсьПоследняя.Поле2,
    МАКСИМУМ(ЕщеОднаНадеюсьПоследняя.Поле111) КАК Поле111,
    ЕщеОднаНадеюсьПоследняя.Поле1111 КАК Поле1111
ПОМЕСТИТЬ НетТаБылаНеПоследняя
ИЗ
    ЕщеОднаНадеюсьПоследняя КАК ЕщеОднаНадеюсьПоследняя

СГРУППИРОВАТЬ ПО
    ЕщеОднаНадеюсьПоследняя.Поле2,
    ЕщеОднаНадеюсьПоследняя.Поле1111
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    НетТаБылаНеПоследняя.Поле2 КАК Значение,
    НетТаБылаНеПоследняя.Поле111 - ВЫБОР
        КОГДА НетТаБылаНеПоследняя.Поле1111 = 1
            ТОГДА 0
        ИНАЧЕ НетТаБылаНеПоследняя.Поле1111
    КОНЕЦ КАК Количество
ИЗ
    НетТаБылаНеПоследняя КАК НетТаБылаНеПоследняя

УПОРЯДОЧИТЬ ПО
    НетТаБылаНеПоследняя.Поле1111
10 sqr4
 
19.04.17
17:37
В конце рабочего дня. Полюбому можно проще
11 sqr4
 
19.04.17
17:45
А ну и получится немного не то что нужно
12 SoulPower
 
19.04.17
19:03
ВЫБРАТЬ
    ДАТАВРЕМЯ(2017, 3, 31) КАК Дата,
    НЕОПРЕДЕЛЕНО КАК Поле
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2017, 4, 1),
    ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2017, 4, 2),
    ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2017, 4, 3),
    ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2017, 4, 4),
    ЛОЖЬ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2017, 4, 5),
    ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2017, 4, 6),
    ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2017, 4, 7),
    ЛОЖЬ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2017, 4, 8),
    ЛОЖЬ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2017, 4, 9),
    ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2017, 4, 10),
    НЕОПРЕДЕЛЕНО
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Данные.Дата КАК Дата,
    Данные.Поле КАК Поле
ПОМЕСТИТЬ ДниСменыСостояний
ИЗ
    Данные КАК Данные
        ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Данные1
        ПО (Данные.Дата = ДОБАВИТЬКДАТЕ(Данные1.Дата, ДЕНЬ, 1))
            И Данные.Поле <> Данные1.Поле
ГДЕ
    НЕ Данные1.Дата ЕСТЬ NULL
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДниСменыСостояний.Дата КАК Дата,
    МИНИМУМ(РАЗНОСТЬДАТ(ДниСменыСостояний.Дата, ДниСменыСостояний1.Дата, ДЕНЬ)) КАК ПродолжительностьДней,
    ДниСменыСостояний.Поле КАК Состояние
ПОМЕСТИТЬ Результат
ИЗ
    ДниСменыСостояний КАК ДниСменыСостояний
        ЛЕВОЕ СОЕДИНЕНИЕ ДниСменыСостояний КАК ДниСменыСостояний1
        ПО ДниСменыСостояний.Дата < ДниСменыСостояний1.Дата

СГРУППИРОВАТЬ ПО
    ДниСменыСостояний.Дата,
    ДниСменыСостояний.Поле
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Результат.Дата КАК НачалоПериода,
    ДОБАВИТЬКДАТЕ(Результат.Дата, ДЕНЬ, Результат.ПродолжительностьДней - 1) КАК ОкончаниеПериода,
    Результат.ПродолжительностьДней КАК ПродолжительностьДней,
    Результат.Состояние КАК Состояние
ИЗ
    Результат КАК Результат

УПОРЯДОЧИТЬ ПО
    НачалоПериода
13 SoulPower
 
19.04.17
19:04
Вроде работает, в начале и конце периода добавил состояние неопределено, потому что первый и последний периоды срезаются. Уверен, это легко победить, но это уже как-нибудь сами)
14 Радим1987
 
19.04.17
20:38
15 Ildarovich
 
20.04.17
16:29
Можно проще, чем в (12). Временные таблицы не нужны. Все можно сделать в одном запросе:ВЫБРАТЬ ДАТАВРЕМЯ(2017, 4, 1) КАК Дата, ИСТИНА КАК Явка ПОМЕСТИТЬ Дано
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2017, 4, 2), ИСТИНА
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2017, 4, 3), ИСТИНА
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2017, 4, 4), ЛОЖЬ
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2017, 4, 5), ИСТИНА
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2017, 4, 6), ИСТИНА
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2017, 4, 7), ЛОЖЬ
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2017, 4, 8), ЛОЖЬ
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2017, 4, 9), ИСТИНА
;
ВЫБРАТЬ
    Дано.Дата,
    МИНИМУМ(Дано.Явка) КАК Явка,
    РАЗНОСТЬДАТ(ЕСТЬNULL(МАКСИМУМ(ВЫБОР
                    КОГДА Раньше.Явка <> Дано.Явка
                        ТОГДА Раньше.Дата
                КОНЕЦ), ДОБАВИТЬКДАТЕ(МИНИМУМ(Раньше.Дата), ДЕНЬ, -1)), Дано.Дата, ДЕНЬ) КАК РазПодряд
ИЗ
    Дано КАК Дано
        ЛЕВОЕ СОЕДИНЕНИЕ Дано КАК Раньше
        ПО (Раньше.Дата <= Дано.Дата)

СГРУППИРОВАТЬ ПО
    Дано.Дата
УПОРЯДОЧИТЬ ПО
    Дано.Дата
16 SoulPower
 
20.04.17
16:48
(15) Круть!
17 Операция 1Ы
 
20.04.17
16:49
(15) я ждал вас в этой теме, как всегда круто!