【发布时间】:2016-12-20 18:17:28
【问题描述】:
我有一个数据表和一个日历表。我需要填补空白,以便每天有一行。我需要填写日期以及使用先前的有效值进行序列和操作。 NULL 是有效的操作类型。我已经接近了,但 NULLS 一直在搞砸我的结果。
我正在使用 SQL Server 2014。非常感谢您的帮助。
数据:
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|
日历:
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 |
期望的结果:
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 建立测试表:
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' )
【问题讨论】:
-
我认为使用代码而不是 SQL 会更容易做到这一点
-
抱歉,我对标签感到满意...如果可以的话,我会编写代码...
-
虽然我没有时间为您编写查询,但我会为您指明正确的方向:您可以执行类似 select * from table1 t1 left join table2 t2 ON 之类的操作t1.dDate
-
我建议通读这个。虽然它不能完全解决您的问题,但它可以帮助您构建所需的主子查询。 stackoverflow.com/questions/19432913/…
标签: sql-server date datetime