Ограничение данных по предоставленному пользователем диапазону дат - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь создать отчет для некоторых исторических данных на основе предоставленного пользователем диапазона дат.В отчете будут отображаться ежемесячные изменения для всех контрактов на основе диапазона дат, предоставленного пользователем.

Включено 2 таблицы.Первая - это таблица ContractDetails, которая содержит 1 строку для каждого контракта со всей необходимой базовой информацией.

ContractID | LicenseID | StartDate  |  EndDate
---------- | --------- | ---------- | ----------
   304     |  ID-567   | 01/01/2018 | 12/31/2018
   331     |  ID-133   | 01/01/2015 | 12/31/2017
   1011    |  ID-257   | 06/06/2018 | 12/31/2018
   1359    |  ID-687   | 01/01/2018 | 12/31/2020

Вторая таблица - это ContractChanges.Который в основном просто хранит транснациональную историю изменений в контракте с FK по ContractID

 ID  | FK_ContractID | LicenseID | ChangeDate
---- | ------------- | --------- | ----------
 101 |      304      |   ID-123  | 12/28/2018
 102 |      331      |   ID-615  | 05/25/2018
 103 |      331      |   ID-994  | 10/31/2018
 104 |     1011      |   ID-498  | 04/04/2019
 105 |     1011      |   ID-701  | 04/04/2019

Предполагая, что пользователь предоставил даты с 11/1/2018 по 30/06/2019.Ожидаемый результат будет таким:

ContractID | LicenseID | Month | Year
---------- | --------- | ----- | ----
   304     |   ID-567  |  Nov  | 2018
   304     |   ID-123  |  Dec  | 2018
   331     |   ID-994  |  Nov  | 2018
  1011     |   ID-257  |  Nov  | 2018
  1011     |   ID-701  |  Apr  | 2019
  1359     |   ID-687  |  Nov  | 2018

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

Это кажется довольно простой проблемой, но то, что меня отталкивает, является последним требованием, когда несколько изменений происходят в одном и том жемесяц.

Любая помощь будет оценена Спасибо

1 Ответ

0 голосов
/ 25 июня 2019

Документирование логики в соответствии с запросом. Этот ответ неполный , так как в нем отсутствует фильтрация даты.

Вы можете уточнить этот запрос, чтобы добавить точную логику, которая вам нужна, но она должна быть хорошей отправной точкой:

select
  ContractID, LicenseID, m as [Month], y as [Year]
from (
  select
    *,
    row_number() over(partition by ContractID, y, m order by dt DESC) as rn
  from (
    select
      ContractID, LicenseID, StartDate as dt,
      month(StartDate) as m, year(StartDate) as y
    from ContractDetails
    union all 
    select
      FK_ContractID, LicenseID, ChangeDate,
      month(ChangeDate), year(ChangeDate)
    from ContractChanges
  ) x
) y
where rn = 1 -- this predicate keeps only the last row in each month
order by ContractID, y, m
...