Сделать оптимальный запрос: левое соединение только одного значения ближайшее к дате
11.12.2012
15:43
#1
Вопрос к знатокам запросов.
Есть запрос, который к ОсновнойРегистрСведений должен добавить данные из ДанныеРегистра при совпадении поля Сотрудник
Но добавить только одно ближайшее к ДатаДействия значение.
Не соображу как оптимальнее выбрать только ОДНО значение из регистра.
В примере ниже у меня добавляются все записи регистра ДанныеРегистра, если ДанныеРегистра.Дата <= ОсновнойРегистрСведений.ДатаДействия
ВЫБРАТЬ
ДанныеРегистра.Сотрудник,
ДанныеРегистра.Дата,
ДанныеРегистра.Значение,
ОсновнойРегистрСведений.Сотрудник КАК Сотрудник1,
ОсновнойРегистрСведений.ДатаДействия КАК Дата1
ИЗ
ОсновнойРегистрСведений КАК ОсновнойРегистрСведений
ЛЕВОЕ СОЕДИНЕНИЕ ДанныеРегистра КАК ДанныеРегистра
ПО ОсновнойРегистрСведений.Сотрудник = ДанныеРегистра.Сотрудник
И (ДанныеРегистра.Дата <= ОсновнойРегистрСведений.ДатаДействия )
Есть запрос, который к ОсновнойРегистрСведений должен добавить данные из ДанныеРегистра при совпадении поля Сотрудник
Но добавить только одно ближайшее к ДатаДействия значение.
Не соображу как оптимальнее выбрать только ОДНО значение из регистра.
В примере ниже у меня добавляются все записи регистра ДанныеРегистра, если ДанныеРегистра.Дата <= ОсновнойРегистрСведений.ДатаДействия
ВЫБРАТЬ
ДанныеРегистра.Сотрудник,
ДанныеРегистра.Дата,
ДанныеРегистра.Значение,
ОсновнойРегистрСведений.Сотрудник КАК Сотрудник1,
ОсновнойРегистрСведений.ДатаДействия КАК Дата1
ИЗ
ОсновнойРегистрСведений КАК ОсновнойРегистрСведений
ЛЕВОЕ СОЕДИНЕНИЕ ДанныеРегистра КАК ДанныеРегистра
ПО ОсновнойРегистрСведений.Сотрудник = ДанныеРегистра.Сотрудник
И (ДанныеРегистра.Дата <= ОсновнойРегистрСведений.ДатаДействия )
11.12.2012
15:47
#3
Это как?
Я срезаю на ОсновнойРегистрСведений.ДатаДействия, а она всегда разная.
Я не знаю как в параметры добавить данные из другой таблицы (((((
Я срезаю на ОсновнойРегистрСведений.ДатаДействия, а она всегда разная.
Я не знаю как в параметры добавить данные из другой таблицы (((((
11.12.2012
16:05
#4
В 2 пакета надо делать.
- Определяешь самую раннюю или самую позднюю дату по сотруднику (функции минимум и максимум в группировке).
- Соединяешь с данными через связь максимальной (или минимальной даты) с датой данных.
- Определяешь самую раннюю или самую позднюю дату по сотруднику (функции минимум и максимум в группировке).
- Соединяешь с данными через связь максимальной (или минимальной даты) с датой данных.
11.12.2012
16:10
#5
> - Определяешь самую раннюю или самую позднюю дату по сотруднику (функции минимум и максимум в группировке).
Теоретически могут быть три даты на одного сотрудника. Как быть со средней датой тогда?
> - Соединяешь с данными через связь максимальной (или минимальной даты) с датой данных.
А тут не понятно условие связи (((
Теоретически могут быть три даты на одного сотрудника. Как быть со средней датой тогда?
> - Соединяешь с данными через связь максимальной (или минимальной даты) с датой данных.
А тут не понятно условие связи (((
11.12.2012
17:43
#6
У тебя есть выборка
Сотрудник | ДатаДействия
в первом пакете получаешь
Сотрудник | ДатаДействия | Дата1
Дата2
Дата3
группируешь и получаешь
Сотрудник | ДатаДействия | МинДата
получаешь значения на минимальную дату
Сотрудник | ДатаДействия | МинДата = ДатаN | Значение
Вот вроде бы на пальцах расписал. Если и сейчас не понятно, то давай выкладывай структуру регистров и четкое описание задачи.
Сотрудник | ДатаДействия
в первом пакете получаешь
Сотрудник | ДатаДействия | Дата1
Дата2
Дата3
группируешь и получаешь
Сотрудник | ДатаДействия | МинДата
получаешь значения на минимальную дату
Сотрудник | ДатаДействия | МинДата = ДатаN | Значение
Вот вроде бы на пальцах расписал. Если и сейчас не понятно, то давай выкладывай структуру регистров и четкое описание задачи.
12.12.2012
07:59
#7
По одному сотруднику это понятно, а когда много сотрудников?
> группируешь и получаешь
>
> Сотрудник | ДатаДействия | МинДата
Как сгруппировать и получить МинДата у каждого сотрудника?
> группируешь и получаешь
>
> Сотрудник | ДатаДействия | МинДата
Как сгруппировать и получить МинДата у каждого сотрудника?
12.12.2012
08:05
#8
"Вот запрос, которые можно допилить (состоит из временных таблиц):
ВЫБРАТЬ
ДанныеРегистра.Сотрудник,
ДанныеРегистра.Дата,
ДанныеРегистра.Значение
ПОМЕСТИТЬ ВТ_ДанныеРегистра
ИЗ
ДанныеРегистра КАК ДанныеРегистра
;
//////////////////////////////////////////////////// ////////////////////////////
ВЫБРАТЬ
ОсновнойРегистрСведений.Сотрудник КАК Сотрудник1,
ОсновнойРегистрСведений.ДатаДействия КАК Дата1
ПОМЕСТИТЬ ВТ_ОсновнойРегистр
ИЗ
ОсновнойРегистрСведений КАК ОсновнойРегистрСведений"
ВЫБРАТЬ
ДанныеРегистра.Сотрудник,
ДанныеРегистра.Дата,
ДанныеРегистра.Значение
ПОМЕСТИТЬ ВТ_ДанныеРегистра
ИЗ
ДанныеРегистра КАК ДанныеРегистра
;
////////////////////////////////////////////////////
ВЫБРАТЬ
ОсновнойРегистрСведений.Сотрудник КАК Сотрудник1,
ОсновнойРегистрСведений.ДатаДействия КАК Дата1
ПОМЕСТИТЬ ВТ_ОсновнойРегистр
ИЗ
ОсновнойРегистрСведений КАК ОсновнойРегистрСведений"
Читают тему
(гостей: 1)