Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос - вывести интервалы по датам  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Есть 3 таблицы - Контракты, Задания, Задания в контрактов :

Контракты : (ContractID, ContractName)
Контракт1
Контракт2
Контракт3

Задания : (TaskId, TaskName)
Задание1
Задание2
Задание3

Задания в контрактах : (ContractId, TaskId, StartDate)
Контракт1 Задание1 01.01.2013
Контракт1 Задание2 15.01.2013
Контракт1 Задание3 17.01.2013
Контракт1 Задание3 22.01.2013
Контракт1 Задание2 15.02.2013
Контракт1 Задание3 08.03.2013

Контракт2 Задание1 13.01.2013
Контракт2 Задание2 16.04.2013
Контракт2 Задание1 05.06.2013
Контракт2 Задание1 15.06.2013
Контракт2 Задание3 22.06.2013
Контракт2 Задание2 01.09.2013

Контракт3 Задание1 02.02.2013
Контракт3 Задание2 17.02.2013
Контракт3 Задание3 28.03.2013
Контракт3 Задание1 22.04.2013
Контракт3 Задание1 13.05.2013


Необходимо вывести последний период для каждого контакта, когда было активно Задание2.

Т.е.
Контракт1 15.02.2013 - 07.03.2013
Контракт2 01.09.2013 - сегодняшний день (так как потом нет других заданий)
Контракт3 17.02.2013 - 27.03.2013


Как это можно сделать?
1 ноя 13, 11:53    [15063497]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - вывести интервалы по датам  [new]
Добрый Э - Эх
Guest
lead/lag, либо их заменители на top 1 подзапросах для более древних, нежели 2012, версий сервера
1 ноя 13, 13:15    [15064304]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - вывести интервалы по датам  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Добрый Э - Эх,

Необходимо вывести не дату, а период...
1 ноя 13, 13:17    [15064340]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - вывести интервалы по датам  [new]
Glory
Member

Откуда:
Сообщений: 104751
Naile
Т.е.
Контракт1 15.02.2013 - 07.03.2013

А откуда взялась дата 07.03.2013 для Контракт1 Задание2 ?
1 ноя 13, 13:24    [15064408]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - вывести интервалы по датам  [new]
Добрый Э - Эх
Guest
Naile,

я тебя понял. поэтому еще раз повторю, если не понял ты - lead/lag, либо их заменители на top 1 подзапросах для более древних, нежели 2012, версий сервера

З.Ы.
Пояснения:
LEAD/LAG позволяют получать доступ к последующим / предыдущим строкам таблицы в рамках заданной сортировки. Смекаешь?
Дату начала периода ставим ту, что есть для текущей строки, дату кончала - LEAD-ом из следующей строки выдергиваем, если она есть, если нет - оно само NULL вернет.
1 ноя 13, 13:24    [15064413]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - вывести интервалы по датам  [new]
Добрый Э - Эх
Guest
Glory
Naile
Т.е.
Контракт1 15.02.2013 - 07.03.2013

А откуда взялась дата 07.03.2013 для Контракт1 Задание2 ?
следующая дата - 1 день. ведь 8-го уже следующее задание делать начали
1 ноя 13, 13:25    [15064423]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - вывести интервалы по датам  [new]
Glory
Member

Откуда:
Сообщений: 104751
Добрый Э - Эх
следующая дата

От чего следуюшая дата ?
1 ноя 13, 13:26    [15064436]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - вывести интервалы по датам  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
Glory
пропущено...

А откуда взялась дата 07.03.2013 для Контракт1 Задание2 ?
следующая дата - 1 день. ведь 8-го уже следующее задание делать начали


Контракт1 Задание2 15.02.2013 [08.03.2013 - 1 день] = 07.03.2013
Контракт1 Задание3 08.03.2013
1 ноя 13, 13:26    [15064445]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - вывести интервалы по датам  [new]
Добрый Э - Эх
Guest
Glory
Добрый Э - Эх
следующая дата

От чего следуюшая дата ?
от текущей строки, в рамках сортровки по дата в разрезе контракта.
вроде же все понятно ТС изложил...
1 ноя 13, 13:27    [15064453]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - вывести интервалы по датам  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
Glory
Добрый Э - Эх
следующая дата

От чего следуюшая дата ?


Это мы уже в Новосибе бухаем а Вам еще рано
1 ноя 13, 13:31    [15064483]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - вывести интервалы по датам  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Вообщем наваяла, делюсь...
Даже работает.

select [From].ID, [From].[StarDate],

(select top 1 StartDate as EndDate from tbl_ContractTask where StartDate > [From].StarDate
and ContractID = [From].ID order by StartDate) as [To]
from
(select c.Id,
(select top 1 ct.StartDate from tbl_ContractTask ct where ct.ResultID = <id нужного задания> 
and ct.ContractID = c.Id
order by ct.StartDate desc) as StarDate
from tbl_Contract c
where c.ID in
(
select distinct ContractID from tbl_ContractTask where ResultID = <id нужного задания>
)) as [From]
1 ноя 13, 13:42    [15064591]     Ответить | Цитировать Сообщить модератору
 Re: Запрос - вывести интервалы по датам  [new]
Добрый Э - Эх
Guest
Naile
Вообщем наваяла, делюсь...
Я бы "перевоял"...
Как минимум, почитать про [CROSS | OUTER] APPLY и применить полученные знания на практике.
1 ноя 13, 15:58    [15065929]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить