2017-06-27 27 views
0

比方说,我有T1:分配值

id   date  attribute 
1  2017-04-20  t 
1  2017-04-19  t 
1  2017-04-18  t 
2  2017-04-20  t 
2  2017-04-19  f 

而且我也有T2:

id   date  date_end attribute 
    1  2017-04-19 2017-04-25  f 

我想要的是得到一个新的表,这将包含来自T1的数据,但如果两个表中都有匹配的ID,则将T2中的属性值替换为T2中定义的日期范围内的属性值。

结果是这样的:

id   date  attribute 
    1  2017-04-20  f 
    1  2017-04-19  f 
    1  2017-04-18  t 
    2  2017-04-20  t 
    2  2017-04-19  f 

我已经想出如下:

SELECT t1.id, t1.date, 
CASE WHEN max(T2.id) IS NULL THEN T1.attribute ELSE T2.attribute END 
FROM T1 
LEFT JOIN T2 using (id) 

无法弄清楚如何改变属性的特定范围。 任何帮助表示赞赏!

回答

3

我认为这仅仅是LEFT JOINCOALESCE()

SELECT t1.id, t1.date, 
     COALESCE(t2.attribute, t1.attribute) as attribute 
FROM T1 LEFT JOIN 
    T2 
    ON t1.id = t2.id AND 
     t1.date >= t2.date and t1.date <= t2.date_end; 
+0

令人惊叹!太简单。谢谢! – hamsy

2

对于BigQuery的标准SQL

#standardSQL 
SELECT 
    a.id, 
    a.date, 
    CASE 
    WHEN a.date BETWEEN b.date AND b.date_end THEN b.attribute 
    ELSE a.attribute 
    END AS attribute 
FROM T1 AS a 
LEFT JOIN T2 AS b 
ON a.id = b.id 

您可以播放/从你的问题样本数据进行测试

#standardSQL 
WITH T1 AS (
    SELECT 1 AS id, '2017-04-20' AS date, 't' AS attribute UNION ALL 
    SELECT 1, '2017-04-19', 't' UNION ALL 
    SELECT 1, '2017-04-18', 't' UNION ALL 
    SELECT 2, '2017-04-20', 't' UNION ALL 
    SELECT 2, '2017-04-19', 'f' 
), 
T2 AS (
    SELECT 1 AS id, '2017-04-19' AS date, '2017-04-25' AS date_end, 'f' AS attribute 
) 
SELECT 
    a.id, 
    a.date, 
    CASE 
    WHEN a.date BETWEEN b.date AND b.date_end THEN b.attribute 
    ELSE a.attribute 
    END AS attribute 
FROM T1 AS a 
LEFT JOIN T2 AS b 
ON a.id = b.id 
-- ORDER BY 1,2 DESC