Имя: Пароль:
1C
1С v8
Задачка на запросы для разминки мозгов
,
0 Sewace
 
20.02.14
16:53
Навеяно темой "JOB: Насколько вопрос сложен для соискателя?" про "СрезПредПредПоследних".

Не первый раз попадается такая задачка. Хочу ее предложить тут в качестве разминки для мозга.

Итак, предположим есть временная таблица "ТЗ" (это чтобы не привязываться к объектам конфигурации) со следующими полями:

- "ДатаСобытия" (Дата, без времени);
- "Контрагент";
- "Событие".

Пример заполнения:
01.02.2014, Иванов, Звонок
02.02.2014, Иванов, Встреча
04.02.2014, Петров, Звонок.

Требуется получить таблицу уникальных контрагентов с указанием последних даты события и самого события. Колонки: "Контрагент", "ПоследняяДата", "ПоследнееСобытие".

Для приведенного примера результат должен быть таким:
Иванов, 02.02.2014, Встреча
Петров, 04.02.2014, Звонок.

Сразу хочу оговориться, что трудность возникает в том случае, если за один день у данного контрагента будет несколько событий. В этом случае надо вывести ЛЮБОЕ из этих событий (нет способа определить из таблицы какое было раньше или позже).

Вот. Вот такое задание можно дать на собеседовании.
Если кому-то интересно, то можно пораскинуть мозгами и выкладывать тут примеры запросов.
1 ДенисЧ
 
20.02.14
16:56
Скучно. Тупая задача.
2 МойКодУныл
 
20.02.14
16:57
Первая выборка с группировкой по контрагенту дата МАКСИМУМ (на событие не смотрим)
соединяем с полной таблицей левым соединением по дате и контаргенту, потом полученное группируем по Контаргенту, дате  - Событие Максимум.
3 PR
 
20.02.14
17:01
(0) 10 задача из http://odinesnik.ru/task.txt
4 fisher
 
20.02.14
17:43
Проще сразу спросить - "читали ли вы статью на мисте про срез последних на каждую дату в запросе?"
5 Фатих Ридванов
 
20.02.14
17:53
(0) Вот пример запроса.
ВЫБРАТЬ
    МАКСИМУМ(СобытиеТЗ.Дата) КАК Дата,
    СобытиеТЗ.Контрагент
ПОМЕСТИТЬ ТЗ
ИЗ
    Документ.Событие.ТЗ КАК СобытиеТЗ

СГРУППИРОВАТЬ ПО
    СобытиеТЗ.Контрагент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СобытиеТЗ.Контрагент,
    СобытиеТЗ.Дата,
    МАКСИМУМ(СобытиеТЗ.События) КАК События
ИЗ
    Документ.Событие.ТЗ КАК СобытиеТЗ
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ
        ПО СобытиеТЗ.Контрагент= ТЗ.Контрагент
            И СобытиеТЗ.Дата = ТЗ.Дата

СГРУППИРОВАТЬ ПО
    СобытиеТЗ.Контрагент,
    СобытиеТЗ.Дата
6 Feunoir
 
20.02.14
18:01
(0) А вот в FoxPro можно было использовать агрегатные функции в SQL запросе без обязательной группировки по остальным полям. Вот там была веселуха. Правда это было двадцать лет назад и подробностей я уже не припомню. Но для меня был шок, когда я узнал, что например Interbase (да и вообще любая адекватная СУБД), такого не позволяет.
7 Torquader
 
20.02.14
22:06
(6) В семёрке тоже можно функцию в запросе попытаться использовать, но скорость исполнения говорит, что не нужно.
8 МихаилМ
 
21.02.14
01:17
(7)

ms sql profiler и filemon . "говортят" почему.
9 МишельЛагранж
 
21.02.14
01:31
(0)Сразу хочу оговориться, что трудность возникает в том случае
трудность возникает в каком угодно случае:
- строки задвоены
- будут указаны не все данные
- данные не верны
- ...
10 МишельЛагранж
 
21.02.14
02:39
(0) пора организовывать на мисте клуб по интересам "Стажеры обмениваются опытом".
Сплошь темы оттуда пошли.
11 Torquader
 
21.02.14
15:14
Так и запишем "клуб молодых дятлов".
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.