Ich habe eine Liste von einzelnen Daten, die ich aus Zeitrahmen extrahieren muss.Erstellen Sie eine Liste von hohen und niedrigen Daten aus einem einzigen Datum in T-SQL
Beispiel:
2014-02-27
2015-04-06
2016-01-31
Ich mag würde Zeitrahmen sehen: mit LAG und LEAD in CASE-Anweisungen
Low Datum aufsteigend Datum
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)
ich versucht habe. Dies bringt mich nahe, aber nicht das gewünschte Ergebnis, wie im obigen Beispiel gezeigt.
Wie kann ich das erreichen?
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'
Dieser Code gibt die richtige Tabelle zurück. Danke! Ich schätze es sehr.
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'
Vielen Dank noch einmal @JuanCarlosOropeza
Dies ist, wie die Daten aussehen, wenn ich den Code ausführen. Dies sind die richtigen Ergebnisse.
+------------+------------+------------+------------+------------+----------+------------+
| 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 |
+------------+------------+------------+------------+------------+----------+------------+
Ich erstellte eine Ansicht und legte den Code ein. Ein SELECT von VIEW gibt dies zurück. Dies sind nicht die richtigen Ergebnisse. Sie sind nicht gleich wie direkt von der Abfrage.
+--------------+------------+------------+------------+------------+----------+------------+
| 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 |
+--------------+------------+------------+------------+------------+----------+------------+
Warum gibt es diesen Datensatz zurück?
anzeigen Was hast du versucht und welches Ergebnis hast du? Bitte lesen Sie [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein großartiger Ort, um [** START **] (http : //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) um zu erfahren, wie Sie die Qualität Ihrer Fragen verbessern und bessere Antworten erhalten. –
@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