2017-06-08 4 views
0

Eingang:Start- und Enddatum aus einem Datumsspalte

Id |Status |Modified_date 
----------------------------------------- 
1 |active |20-10-2016 
1 |removed |09-11-2016  
2 |active |21-10-2016  
2 |removed |11-01-2017 

Ich möchte Startdatum und Enddatum als neue Spalten hinzufügen und die Ausgabe aussehen sollte

ID  | status | start_Date | end_date 
----------------------------------------- 
1/1/1900 | active | 20-10-2016 |9/11/2016    
1/1/1900 | removed | 9/11/2016 |99-99-9999 
1/2/1900 | active | 21-10-2016 |11/1/2017  
1/2/1900 | removed | 11/1/2017 |99-99-9999 

Bitte lassen Sie mich wissen, wie das möglich ist

+1

I zur Verfügung gestellt nur eine Antwort auf diese genaue Situation vor weniger als eine Stunde. https://stackoverflow.com/questions/44437174/merge-values-in-two-rows-in-sql-table-appear-in-zweicolumns-of-one-row/ –

+0

@SeanLange ich denke, es ist ein bisschen anders jetzt =) aber hat etwas gemeinsam mit dem, was Sie getan haben. – Whencesoever

+1

Anstatt alle 9 für ein Enddatum, werden Sie besser NULL hier verwenden. Die Anwesenheit aller Neuner und das Format lassen mich auch fragen, ob das Varchar-Spalten sind. Wenn das der Fall ist, sollten Sie dies wirklich in DateTime-Spalten konvertieren. Was Sie in dem von Ihnen verwendeten Format haben, ist im Hinblick auf den Vergleich von Datumsangaben in SQL-Code sehr schwierig zu handhaben. –

Antwort

0

Einfache OUTER APPLY das Ding tun sollte:

SELECT c.id, 
     c.[status], 
     c.[Modified_date] as [start_date], 
     COALESCE(t.[Modified_date],'99-99-9999') as end_date --or ISNULL 
FROM YourTable c 
OUTER APPLY (
    SELECT TOP 1 [Modified_date] 
    FROM YourTable 
    WHERE ID = c.ID AND [Modified_date] > c.[Modified_date] 
    ) as t 

Ausgang:

id   status start_date end_date 
----------- ------- ---------- ---------- 
1   active 20-10-2016 09-11-2016 
1   removed 09-11-2016 99-99-9999 
2   active 21-10-2016 11-01-2017 
2   removed 11-01-2017 99-99-9999 

Oder LEAD (ab SQL Server 2012) unter Verwendung von:

SELECT id, 
     [status], 
     [Modified_date] as [start_date], 
     LEAD([Modified_date],1,'99-99-9999') OVER (PARTITION BY Id ORDER BY [Modified_date] DESC) as end_date 
FROM YourTable 
+0

Vielen Dank für Ihre Antwort @ gofr1 Ich habe den Code versucht, leider hat es nicht funktioniert, wie ich es erwartet hatte. Weil es mehr Datensätze für eine ID gibt, als ich erwartet hatte. Im Folgenden finden Sie die Eingaben Patient ID | \t Status | \t Typ | \t Änderungsdatum ----------------------------- | Entfernt \t | HHH \t | 08/07/2015 | entfernt \t | HHH \t | 2017.08.07 | entfernt \t | HHH \t | 2018.08.07 | entfernt \t | HHH \t | 2015.08.07 | Aktive \t | Krankenschwester \t | 08/09/2016 | Aktiv \t | Basis \t | 09/09/2016 | Entfernt \t | HHH \t | 08/06/2017 | Entfernt \t | HHH \t | 08/07/2017 – Shafro

+0

Dann müssen Sie Ihre Frage ändern. :) – gofr1

+0

Überprüfen Sie die Antwort! LEAD Teil funktioniert gut und ich habe OUTER APPLY Teil behoben. – gofr1

Verwandte Themen