Имя: Пароль:
1C
 
Запрос. Выбрать одну запись из нескольких
0 poligraf
 
01.02.16
13:32
Упрощу до последнего...

Есть временная таблица в запросе

Петя | 1 | 1 | 0 | 0
Петя | 1 | 1 | 0 | 1
Петя | 1 | 0 | 1 | 0
Вася | 1 | 1 | 0 | 0
Женя | 1 | 1 | 0 | 0

Надо выбрать из нее только одну запись (любую) по "Пете" и оставшиеся по "Васе" и "Жене"

"Первые 1" - выбирает только первую запись
Группировка - свернет, но цифры мне не надо суммировать, количество считать или еще что.
1 Valerianich
 
01.02.16
13:40
Группировка по Максимум (не по Сумма) например...
2 Trotter
 
01.02.16
13:50
Выбрать всё, что есть, а потом в цикле отбросить по условию.
3 poligraf
 
01.02.16
13:52
(1) ну и будет Петя | 1 | 1 | 1 | 1
такого не надо

(2) цикл это крайний случай. Не хочется его
4 ViSo76
 
01.02.16
13:54
(0) Если есть в таблице уникальное значение к примеру дата, которое не может повториться, то решаемо иначе нет. Язык запросов в 1С ограничен.
5 Trotter
 
01.02.16
13:54
Запрос с параметрами тоже не подходит ?)
6 LordCMEPTb
 
01.02.16
13:55
Чтобы в запросе отобрать первую запись по каждому, надо сначала понять, какая из записей первая...
7 patapum
 
01.02.16
13:56
(0) как вариант, запрос с итогами, иерархическая выборка, дальше обход по группировке, а из детальных записей брать первую. или тебе надо в таблицу значений / в отчет?
8 poligraf
 
01.02.16
13:57
(4) спасибо. Там гораздо больше полей, но уникальное откуда взять нашлось
9 f_vadim
 
01.02.16
14:00
пронумеровать строки по каждому пете, выбрать, где номер = 1
10 Бледно Золотистый
 
01.02.16
14:02
(9) Нумерация в запросе - затратное дело.
11 ViSo76
 
01.02.16
14:02
(9) Это нужно делать перемножение, а это ресурсоёмко.
Если есть уникальное поле можно сгруппировать по имени и взять минимум | максимум по уникальному полю, а далее левым соединением с главной таблицей по полю имя и вычисленное уникальное поле отобрать.
12 Rlogin
 
01.02.16
14:04
Итоги по Чувакам.
Обход по итогам и только первую запись брать. Затем след. уровень.
Все складывать в новую табличку.
13 f_vadim
 
01.02.16
14:05
(10) на счёт затрат условий не было. была только хотелка "шоб в запросе"
(11) скучно :)
14 ViSo76
 
01.02.16
14:05
(11) Этот метод применяется если нужно получить цены для некоторого количества документов за разные даты в "одном" запросе.
15 assasu
 
01.02.16
14:05
(0) задачка из области "..тут учет у нас, а тут мы рыбу заворачиваем.."
16 ViSo76
 
01.02.16
14:06
(13) А ты что хочешь чтобы бухгалтера / менеджеры были вытеснены в фоновые процессы на сервере?
17 cw014
 
01.02.16
14:08
Я один не понимаю смысл этой задачи?
18 poligraf
 
01.02.16
14:08
(12) это все семерошный подход и г$%#окод, как ни крути

(13) уникальное условие нашлось. Номер строки. Табличка образований по физлицам. Просто надо взять последнее, с одной стороны год, но может быть и в один год два образования, тут уже любое берем.

(15) Это кадровый учет, свои заморочки
19 cw014
 
01.02.16
14:08
>Надо выбрать из нее только одну запись (любую) по "Пете"
20 cw014
 
01.02.16
14:09
ЛЮБУЮ, КАРЛ! Если любая запись - почему тебе сумма не канает? Тоже какбэ "любая"
21 f_vadim
 
01.02.16
14:09
(16) ой, ну ладно придумывать. задача "сферическая", решение такое же.
там может в таблице 10 записей
22 Timon1405
 
01.02.16
14:09
(17) Петя мухлюет с продажами, надо все равно брать по нему только одну
23 ViSo76
 
01.02.16
14:09
(17) Можешь считать себя уникальным
24 f_vadim
 
01.02.16
14:10
(20) вроде как любая запись, а не любые цифры
25 kosts
 
01.02.16
14:12
(0)
в ВТ (или подзапрос) поместить таблицу ФИО, Макс(к1 + к2*10 + к3*100 + к4*100) как Вес

в конечном запросе
соединение по условию
ВТ.Вес = к1 + к2*10 + к3*100 + к4*100
26 Rlogin
 
01.02.16
14:12
(18) Не знаю как, но не так.
27 poligraf
 
01.02.16
14:13
(20) "ЛЮБУЮ, КАРЛ!"
Сумма полей это уже совсем другая запись.
Ты только на "Петя" возбудился, а остальные поля не видишь и смысла термина "Запись" не понимаешь
28 ViSo76
 
01.02.16
14:13
(25) Дата + Строка + Число + Ссылка ты будешь складывать? Вот это поворот...
29 kosts
 
01.02.16
14:16
(28) Дату можно в число преобразовать. У строки можно минимум длину узнать (правда громоздко).
30 kosts
 
01.02.16
14:18
Проще в исходные данные добавить уникальность
31 ViSo76
 
01.02.16
14:23
(30) Хорошо ссылку во что лепить будешь?
32 patapum
 
01.02.16
14:25
(30), (31) можно соединять по:
ВЫБОР
КОГДА Вт1.Поле1 <> Вт2.Поле1 Тогда Вт1.Поле1 < Вт2.Поле1
КОГДА Вт1.Поле2 <> Вт2.Поле2 Тогда Вт1.Поле2 < Вт2.Поле2
...
КОНЕЦ
33 ViSo76
 
01.02.16
14:27
(32) Очередной борец с ветричками?
34 kosts
 
01.02.16
14:28
Можно попробовать последовательно сделать несколько запросов, в каждом находить МАКС только по одной колонке.
И затем отсекая лишние записи в соединении с этой же таблицей.

Таким образом для данного случая применим 4-ре раза.
35 ViSo76
 
01.02.16
14:31
(34) Ты хоть сам понял что написал? Чем больше ты пишешь тем смешнее выглядишь.
36 kosts
 
01.02.16
14:33
(35) Кому надо будет поймет.
37 HardBall
 
01.02.16
14:37
Пост в топку.
Автору учить 2НФ
38 kosts
 
01.02.16
14:50

Ф    к1    к2    к3    к4
П    1    1    0    0
П    1    1    0    1
П    1    0    1    0
В    1    1    0    0
Ж    1    1    0    0



Выбрать "П" как Ф,1 как к1,1 как к2,0 как к3,0 как к4 ПОМЕСТИТЬ ВТ0 Объединить все
Выбрать "П",1,1,0,1 Объединить все
Выбрать "П",1,0,1,0 Объединить все
Выбрать "В",1,1,0,0 Объединить все
Выбрать "Ж",1,1,0,0;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ0.Ф,
    ВТ0.к1 КАК к1,
    ВТ0.к2,
    ВТ0.к3,
    ВТ0.к4
ПОМЕСТИТЬ ВТ1
ИЗ
    ВТ0 КАК ВТ0
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ВТ0.Ф КАК Ф,
            МАКСИМУМ(ВТ0.к1) КАК к1,
            ВТ0.к2 КАК к2,
            ВТ0.к3 КАК к3,
            ВТ0.к4 КАК к4
        ИЗ
            ВТ0 КАК ВТ0
        
        СГРУППИРОВАТЬ ПО
            ВТ0.Ф,
            ВТ0.к2,
            ВТ0.к3,
            ВТ0.к4) КАК ВложенныйЗапрос
        ПО ВТ0.Ф = ВложенныйЗапрос.Ф
            И ВТ0.к1 = ВложенныйЗапрос.к1
            И ВТ0.к2 = ВложенныйЗапрос.к2
            И ВТ0.к4 = ВложенныйЗапрос.к3
            И ВТ0.к4 = ВложенныйЗапрос.к4
            ;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ1.Ф,
    ВТ1.к1 КАК к1,
    ВТ1.к2,
    ВТ1.к3,
    ВТ1.к4
ПОМЕСТИТЬ ВТ2
ИЗ
    ВТ1 КАК ВТ1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ВТ1.Ф КАК Ф,
            ВТ1.к1 КАК к1,
            МАКСИМУМ(ВТ1.к2) КАК к2,
            ВТ1.к3 КАК к3,
            ВТ1.к4 КАК к4
        ИЗ
            ВТ1 КАК ВТ1
        
        СГРУППИРОВАТЬ ПО
            ВТ1.Ф,
            ВТ1.к1,
            ВТ1.к3,
            ВТ1.к4) КАК ВложенныйЗапрос
        ПО ВТ1.Ф = ВложенныйЗапрос.Ф
            И ВТ1.к1 = ВложенныйЗапрос.к1
            И ВТ1.к2 = ВложенныйЗапрос.к2
            И ВТ1.к4 = ВложенныйЗапрос.к3
            И ВТ1.к4 = ВложенныйЗапрос.к4
            ;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ2.Ф,
    ВТ2.к1 КАК к1,
    ВТ2.к2,
    ВТ2.к3,
    ВТ2.к4
ПОМЕСТИТЬ ВТ3
ИЗ
    ВТ2 КАК ВТ2
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ВТ2.Ф КАК Ф,
            ВТ2.к1 КАК к1,
            ВТ2.к2 КАК к2,
            МАКСИМУМ(ВТ2.к3) КАК к3,
            ВТ2.к4 КАК к4
        ИЗ
            ВТ2 КАК ВТ2
        
        СГРУППИРОВАТЬ ПО
            ВТ2.Ф,
            ВТ2.к1,
            ВТ2.к2,
            ВТ2.к4) КАК ВложенныйЗапрос
        ПО ВТ2.Ф = ВложенныйЗапрос.Ф
            И ВТ2.к1 = ВложенныйЗапрос.к1
            И ВТ2.к2 = ВложенныйЗапрос.к2
            И ВТ2.к4 = ВложенныйЗапрос.к3
            И ВТ2.к4 = ВложенныйЗапрос.к4
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ3.Ф,
    ВТ3.к1 КАК к1,
    ВТ3.к2,
    ВТ3.к3,
    ВТ3.к4
ПОМЕСТИТЬ ВТ4
ИЗ
    ВТ3 КАК ВТ3
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ВТ3.Ф КАК Ф,
            ВТ3.к1 КАК к1,
            ВТ3.к2 КАК к2,
            ВТ3.к3 КАК к3,
            МАКСИМУМ(ВТ3.к4) КАК к4
        ИЗ
            ВТ3 КАК ВТ3
        
        СГРУППИРОВАТЬ ПО
            ВТ3.Ф,
            ВТ3.к1,
            ВТ3.к2,
            ВТ3.к3) КАК ВложенныйЗапрос
        ПО ВТ3.Ф = ВложенныйЗапрос.Ф
            И ВТ3.к1 = ВложенныйЗапрос.к1
            И ВТ3.к2 = ВложенныйЗапрос.к2
            И ВТ3.к4 = ВложенныйЗапрос.к3
            И ВТ3.к4 = ВложенныйЗапрос.к4



Ф    к1    к2    к3    к4
В    1    1    0    0
Ж    1    1    0    0
П    1    1    0    0
39 kosts
 
01.02.16
14:54
(38) Может и не поможет. Для интереса попробовал. Пока пять минут отчет формировался...
40 HardBall
 
01.02.16
14:58
(38) А если значения Kn В(0,1,2,3...n)
41 kosts
 
01.02.16
14:59
(40) Это уже теория. У ТС 4-ре колонки.
42 ViSo76
 
01.02.16
15:00
(41) Не нужно сверлить зубы через задний проход.
43 kosts
 
01.02.16
15:04
(42) Мне то зачем это говорить. Я порешал конкретную задачу. Все претензии к ТС.
44 ViSo76
 
01.02.16
15:11
(43) Нужно уметь контактировать с заказчиком. Они пишут одно, а на самом деле всё выходит не совсем так. Я подсказал решение в 4-том посте. Твоё решение это натягивание совы на глобус, так сказать сферический конь в вакууме.
45 kosts
 
01.02.16
15:21
(44) Возможно. Однако ТС поставил именно такую задачу. Ему предложили разное, а он там себе уже порешает.
Может у него базу нельзя менять.

Было у меня и такое. Долго работали с одной распределенной базой, в которую запрещено было вносить изменения. Тут и не так еще вывернешься...
46 rs_trade
 
01.02.16
15:24
если надо любую, чем первые 1 не устраивает? она и выбирает любую одну запись.
47 ViSo76
 
01.02.16
15:28
(46) Тем что она и вернёт одну запись, а не по одной записи для каждой фамилии.
48 poligraf
 
01.02.16
17:49
(41) решение было в (4) с чем я согласился, тут же флуд развели:)

На самом деле там 11 колонок:)
Идет разбивка образования на виды (финансовое, физмат, сельское хозяйство и т.д.). Формы статистики это жуть
49 kosts
 
01.02.16
18:17
(48) Запишу себе в блокнот - Полиграф полиграфычу не помогать.
50 ViSo76
 
01.02.16
19:16
(49) Расслабся, всё хорошо, лучше посмотри "Ходячий замок Хаула"
51 Ildarovich
 
10.02.16
23:40
Есть ГОРАЗДО БОЛЕЕ ПРОСТОЕ и БОЛЕЕ УНИВЕРСАЛЬНОЕ решение. Оно заключается в использовании коррелированного запроса:
ВЫБРАТЬ Ф, К1, К2, К3, К4
ИЗ Дано
ГДЕ (Ф, К1, К2, К3, К4)
В (ВЫБРАТЬ ПЕРВЫЕ 1 * ИЗ Дано КАК ВСЁ ГДЕ ВСЁ.Ф = Дано.Ф)

На 8.3 точно работает!
52 cw014
 
11.02.16
07:13
Давно надо сделать в 1С в конструкции запроса "ВЫБРАТЬ ЛЮБУЮ..."
53 НЕА123
 
11.02.16
07:49
(0)
ОБЪЕДИНИТЬ чем не подходит?
54 kosts
 
11.02.16
21:26
(51) Возможно во внутреннем запросе надо сделать сортировку
55 MANlAK
 
25.02.16
16:47
(51) на 8.2 не работает, выдает первичный вариант
56 aleks_default
 
25.02.16
17:11
"ИЗ Дано КАК ВСЁ ГДЕ ВСЁ.Ф = Дано.Ф" - а это что?
57 aleks_default
 
25.02.16
17:18
(56)А че так можно было?