2017-02-20 2 views
0

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?

+0

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. –

+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

Antwort

0

SQL DEMO

nur das aktuelle Datum als Teil der Daten hinzufügen und dann einen Standardwert für den Fall enthalten Lag kann 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 

OUTPUT

|      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

Ich habe versucht, den Code zu verwenden, den Sie mit allen Feldern zeigte, aber es gibt inkonsistente Ergebnisse zurück. – fmogo

+0

was meinst du 'inkonsistente Ergebnisse'? Fühlen Sie sich frei, die sqlfiddle-Demo mit mehr Daten zu aktualisieren und zeigen Sie mir, was das Problem ist. –

+0

Was verwenden Sie, um die Ergebnisse und den Code zu formatieren? – fmogo

Verwandte Themen