我是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函数,尝试使用extract按版本号标识操作系统:
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 │
└─────────────────┴────────────────┘
在我的案例中需要使用什么功能?谢谢。
2条答案
按热度按时间s5a0g9ez1#
你需要的是一个多重的。
如果找到字符串“2012 r2”,则返回该字符串,如果“2012”返回该字符串。。。等。
所以你可以这样做:
这基本上是一个if-else-if,您可以添加任意多的值,我只是使用了这两个值,因为我不想写太多,但在您的情况下,只需添加您需要的所有os值。它有点冗长,但它完成了工作。
功能:
如果找到字符串则返回true,否则返回false,“%”是clickhouse中的regex通配符。由于multif在第一次匹配时停止,因此您将无法获得两个具有相同值的提取字符串。
332nm8kg2#
找到了!
(没有cast,我是receive-exeption:db::exception:unexpected type of filter column.,奇怪…)