2017-07-25 41 views
1

比方说,我们有一个表,看起来像这样:SQL选择独特的元素,并将它们与上两期

enter image description here

我希望能够看到间隔1和间隔2中有多少网址记录有。

其中周期1是“日期>‘2016年1月1日’和日期<‘2017年1月1日’”

和周期2是“日期>‘2014年1月1日’和日期< “2015年1月1日”“

这里是我的期望是什么可视化:

enter image description here

我可以很容易地使用下面的查询单个期间做到这一点:

SELECT URL, COUNT(URL) as Period1 
FROM table WHERE date < '2017-01-01' 
AND date > '2016-01-01' GROUP BY URL 

但是,如何添加Period2的第二列?

任何想法将不胜感激。对不起,如果我不正确地解释自己。

回答

1

为BigQuery的标准SQL

#standardSQL 
SELECT 
    URL AS uri, 
    COUNTIF(date BETWEEN '2016-01-01' AND '2016-12-31') AS Period1, 
    COUNTIF(date BETWEEN '2014-01-01' AND '2014-12-31') AS Period2 
FROM `LogFilesv2_Dataset.DE_Visits` 
GROUP BY URL 
+0

非常感谢你很多,米沙,你是最棒的! –

2

只需更改日期在下面的查询,它将计算命中每期

SELECT [URL] 
,SUM(CASE WHEN (date >= '12/22/2015' And date <='12/23/2015') THEN 1 Else 0 END) 
,SUM(CASE WHEN (date > '12/30/2015' And date < '12/31/2015') THEN 1 Else 0 END) 
FROM LogFilesv2_Dataset.DE_Visits 
Group by URL 
+0

我真的很好奇 - 为什么投了错误的答案(S)!?最近有这么多这样的案例! :o( –

+1

我的,坏的,其实是SUM,不是 –

+0

这个答案(编辑版本)也能返回正确的输出,据我所知。非常感谢你,拉斐尔,我真的很感谢你的努力! –

0

不知道你正在使用的数据库。但对于Oracle数据库,您可以尝试使用像这样的标量子查询。

select url,(select count(*) from test where url=t.url and date_col <= sysdate and date_col > sysdate-20) period1,(select count(*) from test where url=t.url and date_col <= sysdate and date_col > sysdate-40) period2 

from test t group by url;

您可以在上面的查询中适当地替换日期范围。

提供SQL脚本来创建表并填充数据总是有帮助的。

相关问题