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

Откуда: Прага
Сообщений: 10
Привет,

название в теме не совсем точно описывает суть проблемы.
А суть такова:
имеется одна таблица договор в которой поля: DateOfSign, WhoSign
потом вторая таблица история лицензии с полями: DateOfChanges, State

Первая таблица ясна. А вторая может иметь следующую структуру:
1.1.2017 - 1
1.2.2017 - 2
1.3.2017 - 3
1.4.2017 - 1
1.5.2017 - 3
1.6.2017 - 2
1.7.2017 - 4

Проблема в следующем: как мне узнать, если договор был подписан в ТО время, когда состояние лицензии было 3?
Например, договор был подписан 22.3.2017. Из таблицы видно, что состояние лицензии было 3 (и только в апреле стало 1). То что нужно чтоб вернуло. (Заходя чуть глубже, скажу, что пусть 3 это состояние лицензии когда ты не имеешь права подписывать договора). Вот и надо узнать, если чел подписал тогда когда на то не имел право.
Пробовал конструкцию типа
WHERE dateOfSign<= max(DateOfChanges) and State = 3
но такая запись вернет в max(DateOfChanges) = 1.5.2017

Читая потом заметил, что может оконными функциями такое возможно, но к моему сожалению я в них не разобрался.
Может кто поможет как решить проблему ?

Спасибо
25 янв 18, 19:03    [21139619]     Ответить | Цитировать Сообщить модератору
 Re: Как найти в истории значение которые было после определенной даты  [new]
aleks222
Guest
select * 
   from [таблица договор] as t 
           cross apply ( select * 
                                 from [таблица история лицензии] as x 
                                 where x.DateOfChanges <= t.DateOfSign order by x.DateOfChanges desc 
                            ) as x
   where x.State = 3
25 янв 18, 20:11    [21139768]     Ответить | Цитировать Сообщить модератору
 Re: Как найти в истории значение которые было после определенной даты  [new]
aleks222
Guest
Пардон
select * 
   from [таблица договор] as t 
           cross apply ( select top(1) * 
                                 from [таблица история лицензии] as x 
                                 where x.DateOfChanges <= t.DateOfSign order by x.DateOfChanges desc 
                            ) as x
   where x.State = 3
25 янв 18, 20:14    [21139774]     Ответить | Цитировать Сообщить модератору
 Re: Как найти в истории значение которые было после определенной даты  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
gni,

declare @licenses table ( ChangeDate date, Status int)
insert into @licenses
values ('01.01.2017',1),
('01.02.2017',2),
('01.03.2017',3),
('01.04.2017',1),
('01.05.2017',3),
('01.06.2017',2),
('01.07.2017',4);

With
Periods as (
Select *,lag(ChangeDate) over (order by ChangeDate) as PrevStatusDate From @licenses 
)
Select * From Periods Where Status = 3
26 янв 18, 04:12    [21140156]     Ответить | Цитировать Сообщить модератору
 Re: Как найти в истории значение которые было после определенной даты  [new]
aleks222
Guest
Kopelly
gni,

declare @licenses table ( ChangeDate date, Status int)
insert into @licenses
values ('01.01.2017',1),
('01.02.2017',2),
('01.03.2017',3),
('01.04.2017',1),
('01.05.2017',3),
('01.06.2017',2),
('01.07.2017',4);

With
Periods as (
Select *,lag(ChangeDate) over (order by ChangeDate) as PrevStatusDate From @licenses 
)
Select * From Periods Where Status = 3


Красноярские мужики настолько суровы, что обходятся без лишних таблиц.
26 янв 18, 05:10    [21140171]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить