我目前有两个带有以下内容的表
+-----+-------+-------------------------+
| ID | Value | Create_timestamp |
+-----+-------+-------------------------+
| 001 | A | 2018-01-01 12:00:10.102 |
| 002 | B | 2018-02-15 08:17:00.000 |
| 003 | C | 2018-03-10 00:00:00.000 |
+-----+-------+-------------------------+
和
+-------------------------+-------------------------+---------+------+
| Start_date | End_date | PERIOD | CODE |
+-------------------------+-------------------------+---------+------+
| 2018-01-01 00:00:00.000 | 2018-01-10 00:00:00.000 | PERIOD1 | ABCC |
| 2018-01-10 00:00:00.000 | 2018-02-08 00:00:00.000 | PERIOD2 | ABCC |
| 2018-02-08 00:00:00.000 | 2018-02-15 00:00:00.000 | PERIOD3 | DEFF |
| 2018-02-15 00:00:00.000 | 2018-03-01 00:00:00.000 | PERIOD4 | EFGG |
+-------------------------+-------------------------+---------+------+
有没有一种方法可以合并它,以便我根据第二张表的create_timestamp从第二张表获得PERIOD和YEAR? 即
+-----+----------+------+
| 001 | PERIOD 1 | ABCC |
| 002 | PERIOD 4 | EFGG |
+-----+----------+------+
我觉得case when
语句在这里可以很好地使用,但是我不确定该怎么做,因为没有适当的ID就无法JOIN
。我写了
SELECT a.ID, a.Value
, CASE WHEN a.create_timestamp BETWEEN b.state_date and b.end_date THEN b.PERIOD END
, CASE WHEN a.create_timestamp BETWEEN b.start_date AND b.end_date THEN b.CODE END
FROM a
但是那是我被困住的地方。
我将手动创建一个case when
语句并仅插入值,但是有194行和值包含多年且没有一致的模式。
答案 0 :(得分:2)
进行连接而不是大小写还是更好。而且您不必具有“正确的ID”。请尝试以下操作。
select ts.id, ts.value, p.period, p.code
from timeStamps ts
left join periods p on ts.create_timestamp between p.start_date and p.end_date
请注意,从技术上讲,您具有重叠的范围。您可以在case语句中选择前1个子查询,也可以执行以下操作:
select ts.id, ts.value, p.period, p.code
from timeStamps ts
left join periods p
on ts.create_timestamp >= p.start_date
and ts.create_timestamp < p.end_date
并已了解您的结束日期是一个上限,但是如果实际到达,则不会成功(您需要另一个具有适当开始日期的范围来达到它)。
顺便说一句,我给出了一个左联接,它仍然会输出003的一行,但是它只是将'null'作为所引用表的值。如果您真的想避免这种情况,请执行“内部联接”。
顺便说一句(绝对不要在这里小打气),但是表不是“无关的”。实际上,它们之间有着密切的联系,这就是为什么最好使用“关系”运算符“ join”。
答案 1 :(得分:0)
您的预期输出是将Create_timestamp
与Start_date
链接在一起。
示例:
DECLARE
@t1 TABLE(ID INT, val VARCHAR(5), Create_timestamp DATETIME)
INSERT INTO @t1 VALUES
(001,'A','2018-01-01 12:00:10'),
(002,'B','2018-02-15 08:17:00'),
(003,'C','2018-03-10 00:00:00')
DECLARE
@t2 TABLE(Start_date DATETIME, End_date DATETIME, PERIOD VARCHAR(50), CODE VARCHAR(50))
INSERT INTO @t2 VALUES
('2018-01-01 00:00:00','2018-01-10 00:00:00','PERIOD1','ABCC'),
('2018-01-10 00:00:00','2018-02-08 00:00:00','PERIOD2','ABCC'),
('2018-02-08 00:00:00','2018-02-15 00:00:00','PERIOD3','DEFF'),
('2018-02-15 00:00:00','2018-03-01 00:00:00','PERIOD4','EFGG')
SELECT t1.ID, t2.PERIOD, t2.CODE
FROM @t1 t1
JOIN @t2 t2 ON CAST(t1.Create_timestamp AS DATE) = CAST(t2.Start_date AS DATE)