2017-09-05 178 views
1

我有日期和时间的条目。我希望结果按小时(00,01,02)进行分组,但是当我想要获得用户的不同计数时,就会出现错误。Count(Distinct x)and Group By y

Select Substr(time, 0, 2) as Hour, 
Count(date) as Hits, 
Count(Distinct ip) as Users, 
Count(Distinct X-Forwarded-For) as ForwardedUsers 
From table 
Group By Hour 

编辑: 我使用微软的LOGPARSER的,我能够使用Group By Hour,因为它是和X-Forwarded-For也没问题。 现在的问题是我如何在组内使用Count(Distinct ip)

+1

用您正在使用的数据库标记您的问题。 'Count(Distinct X-Forwarded-For)'是什么?用数值表达式使用'count(distinct)'是很不寻常的。 –

+0

尝试将'X-Forwarded-For'放入反引号中,因为它包含特殊字符。 –

+1

你使用哪个dbms?很多dbms的具体提示在这里......' – jarlh

回答

1

可惜LOGPARSER的不GROUP BY支持DISTINCT聚合函数在一起。这应该是从你上面的查询得到的错误信息明确:

你可以做

Error: Semantic Error: aggregate functions with DISTINCT arguments are not supported with GROUP BY clauses

一个技巧是完全消除GROUP BY条款和计算,而不是COUNT DISTINCT(hourlyIp)其中hourlyIp是串联与小时建立了一个字符串IP地址。在处理结果时,您需要将hourlyIp字段拆分回其组件。

1

大多数数据库引擎不允许您按别名进行分组。更改此:

Group by Hour 

这样:

Substr(time, 0, 2) 
+0

而根据ANSI SQL,只有列可能会在GROUP BY子句中列出。 – jarlh

+0

这不是问题:)但thx – jonasdero