2017-02-20 3 views
0

У меня есть список отдельных дат, из которых мне нужно извлечь временные рамки.Создать список высших и далеких дат с одной даты в T-SQL

пример:

2014-02-27 
2015-04-06 
2016-01-31 

Я хотел бы видеть временные рамки:

Низкая Дата до высокого Дата

1900-01-01 2014-02-07 
2014-02-07 2015-04-06 
2015-04-06 2016-01-31 
2016-01-31 2017-02-28(Current end of month) 

Я попытался с помощью LAG и LEAD в операторах CASE. Это приближает меня, но не желаемый результат, как показано в примере выше.

Как я могу это достичь?

CASE WHEN lag(convert(date,ARD),1) OVER (Partition by InternalID,EpisodeSys, 
groupersys ORDER by InternalID,EpisodeSys, [ARD],groupersys) is null then '1900-01-01' 
    WHEN lag(convert(date,ARD),1) OVER (Partition by InternalID,EpisodeSys,groupersys ORDER by InternalID,EpisodeSys,[ARD],groupersys) is not null and lag(convert(date,ARD),1) OVER (Partition by InternalID,EpisodeSys,groupersys/*,[ARD]*/ ORDER by InternalID,EpisodeSys,[ARD],groupersys) is not null then convert(Date,[ARD]) 
    ELSE convert(date,[ARD]) END as 'Low Date' 

Этот код возвращает правильную таблицу. Спасибо! Я очень ценю это.

SELECT distinct InternalID 
      , episodesys 
      , lag([ARD], 1, '1900-01-01') over 
         (partition by groupersys 
         order by [ARD], groupersys) as 'Low Date' 
      ,[ARD] as 'High Date' 
      , groupersys 
      , RugsCatg 
      ,CASE 
       WHEN lag([ARD], 1, '1900-01-01') over 
         (partition by groupersys 
         order by [ARD],groupersys) = '1900-01-01' 
       then 'A1' 
       ELSE rug_source 
      END as 'rug_source' 
    FROM (SELECT InternalID,episodesys, [ARD],groupersys, RugsCatg, 'A2' as rug_source 
      FROM [MyDB].[dbo].[assessment_detail] 
      UNION 
      SELECT InternalID,episodesys, EOMONTH(GETDATE()),groupersys, RugsCatg, 'A3' as rug_source 
      FROM [MyDB].[dbo].[assessment_detail] 
    ) T 
     where episodesys = '668955' 

Еще раз спасибо @JuanCarlosOropeza

Это как данные выглядят, когда я запускаю код. Это правильные результаты.

+------------+------------+------------+------------+------------+----------+------------+ 
| InternalID | episodesys | Low Date | High Date | groupersys | RugsCatg | rug_source | 
+------------+------------+------------+------------+------------+----------+------------+ 
| ABC123456 |  668955 | 1900-01-01 | 2016-09-07 |   51 | RUB  | A1   | 
| ABC123456 |  668955 | 1900-01-01 | 2016-09-07 |   57 | RUB  | A1   | 
| ABC123456 |  668955 | 2016-09-07 | 2016-09-14 |   51 | RUB  | A2   | 
| ABC123456 |  668955 | 2016-09-07 | 2016-09-14 |   57 | RUB  | A2   | 
| ABC123456 |  668955 | 2016-09-14 | 2017-02-28 |   51 | RUB  | A3   | 
| ABC123456 |  668955 | 2016-09-14 | 2017-02-28 |   57 | RUB  | A3   | 
+------------+------------+------------+------------+------------+----------+------------+  

Я создал представление и поместил в код. SELECT from VIEW возвращает это. Это не правильные результаты. Они не совпадают непосредственно с запросом.

+--------------+------------+------------+------------+------------+----------+------------+ 
| InternalID | episodesys | Low Date | High Date | groupersys | RugsCatg | rug_source | 
+--------------+------------+------------+------------+------------+----------+------------+ 
| 1203V0023697 |  6689 | 2016-09-06 | 2016-09-07 |   51 | RUB  | A2   | 
| 1203V0023697 |  6689 | 2016-09-06 | 2016-09-07 |   57 | RUB  | A2   | 
| 1203V0023697 |  6689 | 2016-09-13 | 2016-09-14 |   51 | RUB  | A2   | 
| 1203V0023697 |  6689 | 2016-09-13 | 2016-09-14 |   57 | RUB  | A2   | 
| 1203V0023697 |  6689 | 2016-12-27 | 2017-02-28 |   51 | RUB  | A3   | 
| 1203V0023697 |  6689 | 2016-12-27 | 2017-02-28 |   57 | RUB  | A3   | 
+--------------+------------+------------+------------+------------+----------+------------+ 

Почему он возвращает этот набор данных?

+0

Показать нас, что вы попробовали и какой результат вы получили. Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http : //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

+0

@JuanCarlosOropeza – fmogo

+0

,CASE \t \t \t WHEN lag(convert(date,ARD),1) OVER (Partition by InternalID,EpisodeSys,groupersys ORDER by InternalID,EpisodeSys,[ARD],groupersys) is null then '1900-01-01' \t \t \t WHEN lag(convert(date,ARD),1) OVER (Partition by InternalID,EpisodeSys,groupersys ORDER by InternalID,EpisodeSys,[ARD],groupersys) is not null and lag(convert(date,ARD),1) OVER (Partition by InternalID,EpisodeSys,groupersys/*,[ARD]*/ ORDER by InternalID,EpisodeSys,[ARD],groupersys) is not null then convert(Date,[ARD]) \t \t ELSE \t \t \t \t \t convert(date,[ARD]) \t \t END as 'Low Date' fmogo

ответ

0

SQL DEMO

Просто добавьте текущую дату как часть данных, а затем Лаг может включать в себя значение по умолчанию в случае NULL

SELECT lag([dt], 1, '1900-01-01') over (order by [dt]) as [low], 
     [dt] as [high] 
FROM (SELECT [dt] FROM Table1 
     UNION ALL 
     SELECT GETDATE() 
    ) T 

ВЫВОД

|      low |      high | 
|----------------------------|----------------------------| 
| January, 01 1900 00:00:00 | February, 27 2014 00:00:00 | 
| February, 27 2014 00:00:00 | April, 06 2015 00:00:00 | 
| April, 06 2015 00:00:00 | January, 31 2016 00:00:00 | 
| January, 31 2016 00:00:00 | February, 20 2017 20:45:35 | 
+0

Я попытался использовать код, который вы показали со всеми полями, но возвращает непоследовательные результаты. – fmogo

+0

что вы подразумеваете под «непоследовательными результатами»? не стесняйтесь обновлять демоверсию sqlfiddle с большим количеством данных и показывать мне, в чем проблема. –

+0

Что вы используете для форматирования результатов и кода? – fmogo