У меня есть список отдельных дат, из которых мне нужно извлечь временные рамки.Создать список высших и далеких дат с одной даты в 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 |
+--------------+------------+------------+------------+------------+----------+------------+
Почему он возвращает этот набор данных?
Показать нас, что вы попробовали и какой результат вы получили. Пожалуйста, прочитайте [** 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/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –
@JuanCarlosOropeza – fmogo
,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