我试图按versiontype统计每周出现在数据中的不同id,但我不确定如何正确构建查询。
我希望制作一张table,大致如下:
1.1 1.2 1.3 1.4
wk1 1 5 4 8
wk2 4 3 9 8
wk3 1 8 0 6
我尝试创建下面的查询,但它无法运行,因为它需要group by中的case语句,而group by则不接受count()。
SELECT
Case when version like "1.1%" then Count(distinct ID)
when version like "1.2%" then Count(distinct ID)
when version like "1.3%" then Count(distinct ID)
when version like "1.4%" then Count(distinct ID) end,
CAST(((datediff(timestamp_pst,'2016-01-03') / 7)+1) as INT) as week_of_the_year
FROM db.table
where timestamp_pst >= "2016-01-28"
group by CAST(((datediff(timestamp_pst,'2016-01-03') / 7)+1) as INT)
order by week_of_the_year
3条答案
按热度按时间s3fp2yjn1#
您希望使用“条件聚合”。这样做,case语句实际上进入聚合函数内部。因为你想
COUNT(DISTINCT)
实际上,您需要使用DISTINCT
聚合中的关键字,或者通过生成一个派生表,以便只显示不同的值,正如另一个答案所示,但它将使您免于重复的唯一单词是DISTINCT
我认为没有必要使用派生表来使问题复杂化。请注意
SUM(CASE WHEN blah THEN 1 ELSE 0 END)
将不适用于您,因为这将对所有事件求和,而不计算不同的值。聚合函数也会忽略空值,如果不包含ELSE
语句大小写表达式的值NULL
如果不匹配。ghhaqwfi2#
你可以用
COUNT()
带条件的聚合函数CASE
声明。请注意
DISTINCT
部分查询发生在派生表中t
. 实际上不需要派生表,但我发现它是一个更干净的解决方案,因为GROUP BY
子句不会重复相同的代码,从而使其更具可读性。这还引入了不在聚合中完成的独特部分。raogr8fs3#
试试这个