Имя: Пароль:
1C
 
Получение минимальной даты в группировке запроса.
0 segun
 
02.03.09
14:30
Народ подскажите пожалуйста, как можно получить минимальную дату из выборке по регистру сведений.

Вот небольшой запрос.

|РаботыПоПроектуСрезПоследних.Статья КАК Статьи,
|МАКСИМУМ(РаботыПоПроектуСрезПоследних.ДатаОкончания) КАК ДатаНачала
|МИНИМУМ(РаботыПоПроектуСрезПоследних.ДатаНачала) КАК ДатаНачала
|
| ИЗ  РегистрСведений.РаботыПоПроекту.СрезПоследних КАК
|РаботыПоПроектуСрезПоследних
|
| СГРУППИРОВАТЬ ПО
|РаботыПоПроектуСрезПоследних.Статья
|
|ИТОГИ
|    МАКСИМУМ(ДатаОкончания),
|    МИНИМУМ(ДатаНачала),
|ПО
|    ОБЩИЕ,
|    Статьи ИЕРАРХИЯ"

Проблема в том, что в для некоторых статей, ДатаНачала не указывается, и соответственно функции Минимум в выборку попадает значение 0, которое и является минимальным значением для группировки по иерархии.  Т.о функция МИНИМУМ(РаботыПоПроектуСрезПоследних.ДатаНачала) в группировке по иерархии выдает 0.
Можно ли, как то отфильтровать нули и, заставить функцию МИНИМУМ работать для всех значений кроме нулевых.
1 ТелепатБот
 
гуру
02.03.09
14:30
2 MoneG
 
02.03.09
15:32
....
|МИНИМУМ(
|    ВЫБОР КОГДА РаботыПоПроектуСрезПоследних.ДатаНачала <> ДАТАВРЕМЯ(1,1,1)
|        ТОГДА   РаботыПоПроектуСрезПоследних.ДатаНачала
|        ИНАЧЕ   &ДатаСреза
|    КОНЕЦ
|        ) КАК ДатаНачала
|ИЗ  РегистрСведений.РаботыПоПроекту.СрезПоследних(&ДатаСреза,) КАК
|РаботыПоПроектуСрезПоследних
....
3 segun
 
02.03.09
17:09
Так не совсем то что нужно. Так минимальной датой может стать ДатаСреза. А нужно чтобы минимальная из не нулевых значений.
4 73
 
02.03.09
17:10
Попробуй
     ИНАЧЕ NULL
5 НЕА123
 
02.03.09
17:18
ГДЕ РаботыПоПроектуСрезПоследних.ДатаНачала <> ДАТАВРЕМЯ(1,1,1)
?
6 Defender aka LINN
 
02.03.09
17:19
(3) А если все пустые?
7 Aprobator
 
02.03.09
17:20
(0) изначально надо определиться, а что вообще с нулевыми значениями делать?
8 segun
 
02.03.09
17:55
Да их хотелось бы просто игнорировать.

Например. В регистре РаботыПоПроекту в срезе последних 3 записи:

Статья              ВремяНачала    ВремяОкончания

Монтаж конструкции                  01.05.2009
Монтаж двигателя    01.04.2009      10.04.2009
Монтаж газоотвода   15.04.2009      20.04.2009

Все эти статьи находятся в группе Монтаж.

Хотелось бы получить следующую выборку
Статья              ВремяНачала    ВремяОкончания

Монтаж              01.04.2009      01.05.2009
Монтаж конструкции                  01.05.2009
Монтаж двигателя    01.04.2009      10.04.2009
Монтаж газоотвода   15.04.2009      20.04.2009
9 73
 
02.03.09
17:58
(8) ИНАЧЕ NULL пробовал?
10 73
 
02.03.09
17:58
(9)+
|МИНИМУМ(
|    ВЫБОР КОГДА РаботыПоПроектуСрезПоследних.ДатаНачала <> ДАТАВРЕМЯ(1,1,1)
|        ТОГДА   РаботыПоПроектуСрезПоследних.ДатаНачала
|        ИНАЧЕ   NULL
|    КОНЕЦ
|        ) КАК ДатаНачала
11 szhukov
 
02.03.09
18:02
(10) Если верить стандарту SQL то в вашем случае получите минимум = Null (если в выборке будет хотя бы одна нулевая дата)
12 Defender aka LINN
 
02.03.09
18:03

ИТОГИ
   МИНИМУМ(ВЫБОР
           КОГДА ДатаНачала = &ПустаяДата
               ТОГДА &ДатаСреза
           ИНАЧЕ ДатаНачала
       КОНЕЦ) КАК ДатаНачала
ПО

Вместо &ДатаНачала можно использовать поле.
13 73
 
02.03.09
18:03
(11) - проверяли в 1С?
14 szhukov
 
02.03.09
18:04
(13) нет
Я же написал за SQL
Вполне возможно у 1С свой стандарт :)
15 73
 
02.03.09
18:07
Если автор уверен, что не может быть все незаполненными, то
можно попробовать:
ИНАЧЕ ДатаВремя(3999,12,31)
16 segun
 
02.03.09
18:12
|    МИНИМУМ(
|    ВЫБОР КОГДА РаботыПоПроектуСрезПоследних.ДатаНачала <> ДАТАВРЕМЯ(1,1,1)
|        ТОГДА   Звезда_РаботыПоПроектуСрезПоследних.ДатаНачала
|        ИНАЧЕ   ЕСТЬ NULL
|    КОНЕЦ
|        ) КАК ДатаНачала,

Такая конструкция работает так же как РаботыПоПроектуСрезПоследних.ДатаНачала.

Монтаж Время начало NULL
17 Defender aka LINN
 
02.03.09
18:14
(16) Я, ять, для кого (12) написал?
18 Новичок
 
02.03.09
18:16
(11)Согласно стандарта SQL:
"The aggregate COUNT(*) counts all NULL and non-NULL tuples; COUNT(attribute) counts all tuples whose attribute value is not NULL. Other SQL aggregate functions ignore NULL values in their computation."
19 segun
 
02.03.09
18:17
На   Defender aka LINN 17. У тебя фактически пустая дата просто подменяется датой среза. Мне же нужно получить минимальную из не нулевых дат.
20 73
 
02.03.09
18:18
(16) И как он с ЕСТЬ еще работает?
21 73
 
02.03.09
18:18
А (15) ?
22 Fragster
 
гуру
02.03.09
18:19
а нафуя в (0) итоги?
23 Aprobator
 
02.03.09
18:20
хм - сделай пустую дату максимальной (типа ДАТАВРЕМЯ(9999,12,31)) и она будет браться в самый последний момент. Ну там  при выводе соответствующий контроль и все.
24 73
 
02.03.09
18:20
(23) см (15) там максимум.
25 73
 
02.03.09
18:21
(24)+ в смысле год максимальный 3999
26 Aprobator
 
02.03.09
18:22
(24) (15) не увидел. Надеюсь я не нарушил авторское право :)
27 Defender aka LINN
 
02.03.09
18:22
(19) Оставь свои фантазии для другого места.
28 73
 
02.03.09
18:24
(26) наздоровье:)
29 segun
 
02.03.09
18:25
Как вариант конечно идея хорошая. Но если в регистре сведений в какой кто из групп статей все начальные даты нулевые. Тогда минимальная дата получается ДАТАВРЕМЯ(9999,12,31), что не корректно.  Конечно можно делать проверку при выводе, такой запрос уже не засунешь в универсальный отчет. А хотелось бы чтобы вся логика осталась на уровне запроса.
30 PR
 
02.03.09
18:27
(29) Какая-то фигня.
Ты определись сам-то, что у тебя ДОЛЖНО БЫТЬ в ситуации, когда
1. Записей нет вообще
2. Все даты пустые
31 Aprobator
 
02.03.09
18:28
(30) а конечная дата может быть пустой? как второй вариант Если дата начала пуста, принимать ее равной дате окончания.
32 Aprobator
 
02.03.09
18:29
или еще варинат получить минимальные даты в другом запросе при условии, что пустые даты в сад, дальше левое соединение, ну и по ситуации.
33 НЕА123
 
02.03.09
18:32
биля...
в (12) же решение

МИНИМУМ(ВЫБОР
           КОГДА ДатаНачала = &ПустаяДата
               ТОГДА ""
           ИНАЧЕ ДатаНачала
       КОНЕЦ) КАК ДатаНачала
34 НЕА123
 
02.03.09
18:33
строка больше даты. всегда.
35 PR
 
02.03.09
18:34
(33) Почему не NULL?
36 Aprobator
 
02.03.09
18:34
(34) вот этого не знал. Надо будет проверить и взять на вооружение.
37 НЕА123
 
02.03.09
18:35
(35) он меньше всех.
38 PR
 
02.03.09
18:36
(37) А NULL в МИНИМУМ попадают?
39 НЕА123
 
02.03.09
18:38
(38) точно не знаю.
но по сабжу это без разницы.
40 73
 
02.03.09
18:39
(37) У меня такой запрос

выбрать ДатаВремя(3999,12,31) как поле
ОбЪединить
выбрать ДатаВремя(2000,1,2)
ОбЪединить
выбрать null
упорядочить по поле

Ставит Null на максимум. Проверял. Может не всегда, не знаю.
Но если NUll и меньше всех, то не всегда.
41 segun
 
02.03.09
18:46
НЕА123
33 - 02.03.09 - 18:32

Чувак П..ц ты гений. Все работает..  УРААА!
42 Новичок
 
02.03.09
18:51
(34)
Правила сравнения значений
Поскольку в языке запросов могут сравниваться значения разных типов, определены правила, по которым выполняется сравнение двух значений. Данные правила используются для:

сравнения значений в операторах сравнения;
определения максимального и минимального значений в агрегатных функциях МИНИМУМ и МАКСИМУМ;
упорядочивания записей результата запроса в соответствии с порядком, заданным в предложении УПОРЯДОЧИТЬ ПО.
Если типы значений отличаются друг от друга, то отношения между значениями определяются на основании приоритета типов:

тип NULL (самый низший);
тип Булево;
тип Число;
тип Дата;
тип Строка;
ссылочные типы.
Отношения между различными ссылочными типами определяются на основе внутренних ссылочных номеров таблиц, соответствующих тому или иному типу.
43 segun
 
02.03.09
19:02
Народ всем огромное спасибо.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший