2017-06-12 536 views
1

我是ClickHouse的初学者,并试图用于处理我们项目的统计信息。一些桌面软件向我们的服务器发送信息,我们需要将操作系统分组到短名单。这个例子查询:ClickHouse中的合并功能替换

SELECT OS 
FROM Req 
GROUP BY OS 

┌─OS──────────────────────────────────────────────────────────────────────────────┐ 
│ Майкрософт Windows 10 Корпоративная 2016 с долгосрочным обслуживанием   │ 
│ Майкрософт Ознакомительная версия Windows Server 2012 Standard     │ 
│ Майкрософт Windows 10 Домашняя для одного языка         │ 
│ Microsoft Windows 8.1 Enterprise            │ 
│ Майкрософт Windows 8 Корпоративная Прогрессивная        │ 
│ Microsoft Windows Server 2008 R2 Standard          │ 
│ Microsoft Windows 8.1 mit Bing             │ 
│ Microsoft Windows 10 Home              │ 
│ Microsoft Windows 8 Enterprise N            │ 
│ Майкрософт Windows 8.1 Профессиональная           │ 
│ Майкрософт Windows 8 Профессиональная           │ 
│ Microsoft Windows 7 Rеактивная             │ 
│ Microsoft Windows 10 Pro Insider Preview          │ 

需要是总计清理名单:

8  xxx 
8.1  yyy 
2008 zzz 
2008 R2 aaa 

等。我没有找到COALESCE的功能,并尝试使用提取物来识别操作系统版本号:

select extract(OS, ' 7 ') || extract(OS, ' 8.1 ') || extract(OS, ' 10 ') || extract(OS, ' 2008 R2 ') || extract (OS, ' 2008 ') || extract(OS, ' 2012 R2 ') || extract(OS, ' 2012 ') as Value, count(distinct SID) from Req group by Value limit 100000; 

但是!由于Windows 2008和Windows 2008 R2有“2008”的版本字符串,我接受这样的结果:

┌─Value───────────┬─uniqExact(SID)─┐ 
│     │   224 │ 
│ 2012   │    17 │ 
│ 10    │   1315 │ 
│ 7    │   4282 │ 
│ 2008   │    20 │ 
│ 2012 R2 2012 │    57 │ 
│ 2008 R2 2008 │   136 │ 
│ 8.1   │   754 │ 
└─────────────────┴────────────────┘ 

我需要什么样的功能是在我的情况下使用?谢谢。

回答

0

找到了!

select OS, arrayFirst(x -> cast(position(OS, x) as UInt8), [' 8 ',' 8.1 ', '2008 R2', '2008']) 
from Req 
limit 1000; 

(不CAST我是收到exeption:DB ::例外:意外的类型的过滤器列,奇怪...)

0

你所需要的就是一个multif。

如果找到字符串“2012 R2”,还给我说,如果“2012”回到我说...等

所以你的情况,你可以做这样的事情:

multiIf(like(OS, '% 2008 R2 %'), extract(OS, ' 2008 R2 ') , like(OS, '% 2008 %'), extract (OS, ' 2008 '), 'OS_not_found') as Value 

这基本上是一个if if else,如果你可以添加任意数量的值,我只是使用了这两个值,因为我不想写太多,但在你的情况下只需添加所需的所有OS值。它有点冗长,但它完成了工作。

功能:

like(OS, '% 2008 R2 %') 

返回true如果字符串被发现,否则为假时,“%”是clickhouse正则表达式通配符。由于multif在第一次匹配时停止,因此不会在同一个值中获取两个提取的字符串。