Ich habe eine Datentabelle und eine Kalender-Tabelle. Ich muss die Lücken füllen, um für jeden Tag eine Zeile zu haben. Ich brauche die Daten, die ausgefüllt werden müssen, sowie den vorherigen gültigen Wert für Sequenz und Aktion. NULL ist ein gültiger Aktionstyp. Ich bin nah dran, aber die NULLS haben mit meinen Ergebnissen geschraubt.SQL Ausfüllen von Daten und Daten
Ich benutze SQL Server 2014. Ihre Hilfe wird sehr geschätzt.
Daten:
ID | Sequence| Date| Action|
---|---------|--------------------|-------|
A | 1 | 4/5/2016 12:09:23 | yield|
A | 2 | 4/7/2016 12:25:16 | stop|
A | 3 | 4/12/2016 11:25:42| NULL|
A | 4 | 4/18/2016 11:25:42| go|
B | 1 | 2/17/2016 14:15:10| yield|
B | 2 | 3/1/2016 7:56:37 | stop|
B | 3 | 4/1/2016 9:24:46 | go|
B | 4 | 5/4/2016 12:25:16 | exit|
Kalender:
DateKey | Date|
--------|--------------------|
2838 | 4/6/2016 0:00:00 |
2839 | 4/7/2016 0:00:00 |
2840 | 4/8/2016 0:00:00 |
2841 | 4/9/2016 0:00:00 |
2842 | 4/10/2016 0:00:00 |
2843 | 4/11/2016 0:00:00 |
2844 | 4/12/2016 0:00:00 |
2845 | 4/13/2016 0:00:00 |
2846 | 4/14/2016 0:00:00 |
2847 | 4/15/2016 0:00:00 |
2848 | 4/16/2016 0:00:00 |
2849 | 4/17/2016 0:00:00 |
2850 | 4/18/2016 0:00:00 |
Wunschergebnisse:
ID | Sequence| Date| Action|
----|---------|--------------------|----------|
A | 1| 4/5/2016 12:09:23| yield|
A | 1| 4/6/2016 0:00:00| yield|
A | 2| 4/7/2016 12:25:16| stop|
A | 2| 4/8/2016 0:00:00| stop|
A | 2| 4/9/2016 0:00:00| stop|
A | 2| 4/10/2016 0:00:00| stop|
A | 2| 4/11/2016 0:00:00| stop|
A | 3| 4/12/2016 10:35:34| NULL|
A | 3| 4/13/2016 0:00:00| NULL|
A | 3| 4/14/2016 0:00:00| NULL|
A | 3| 4/15/2016 0:00:00| NULL|
A | 3| 4/16/2016 0:00:00| NULL|
A | 3| 4/17/2016 0:00:00| NULL|
A | 4| 4/18/2016 11:25:4| go|
TSQL Testtabellen aufstehen:
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Data')
DROP TABLE Data;
CREATE TABLE Data (ID varchar(20), SEQ INT, Date datetime, Action varchar(20));
INSERT INTO data (ID, SEQ, Date, Action) VALUES
('A', 1, '4/5/2016 12:09:23','yield'),
('A', 2, '4/7/2016 12:25:16','stop'),
('A', 3, '4/12/2016 11:25:42','NULL'),
('A', 4, '4/18/2016 11:25:42','go')
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Calendar')
DROP TABLE Calendar;
CREATE TABLE Calendar (DateKey int, Date datetime);
INSERT INTO Calendar (DateKey, Date) VALUES
('2838','4/6/2016 0:00:00'),
('2839','4/7/2016 0:00:00'),
('2840', '4/8/2016 0:00:00'),
('2841', '4/9/2016 0:00:00'),
('2842', '4/10/2016 0:00:00'),
('2843', '4/11/2016 0:00:00'),
('2844', '4/12/2016 0:00:00'),
('2845', '4/13/2016 0:00:00'),
('2846', '4/14/2016 0:00:00'),
('2847', '4/15/2016 0:00:00'),
('2848', '4/16/2016 0:00:00'),
('2849', '4/17/2016 0:00:00'),
('2850', '4/18/2016 0:00:00')
ich denke, es wäre viel einfacher, diese anstelle von SQL – CptMisery
Leider mit dem Code zu tun mit den Tags glücklich klicken ... und ich würde code es, wenn ich in der Lage war ... – dk13
Während ich nicht die Zeit habe, um die Abfrage für Sie zu schreiben, werde ich Sie in die richtige Richtung zeigen: Sie können etwas wie wählen * aus table1 t1 links join table2 tun t2 ON t1.dDate <= t2.dDate, das alle Zeilen aus Tabelle 1 mit allem zusammenfügt, was in Tabelle 2 übereinstimmt, wobei das Datum der Tabelle 2 größer oder gleich dem Datum in tb1 ist. In Ihrem Fall ist es komplizierter als das, aber eine solche Join-Bedingung ist, wo Sie beginnen möchten. –