clickhouse中的合并函数替换

raogr8fs  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(2)|浏览(499)

我是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 │
└─────────────────┴────────────────┘

在我的案例中需要使用什么功能?谢谢。

s5a0g9ez

s5a0g9ez1#

你需要的是一个多重的。
如果找到字符串“2012 r2”,则返回该字符串,如果“2012”返回该字符串。。。等。
所以你可以这样做:

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

这基本上是一个if-else-if,您可以添加任意多的值,我只是使用了这两个值,因为我不想写太多,但在您的情况下,只需添加您需要的所有os值。它有点冗长,但它完成了工作。
功能:

like(OS, '% 2008 R2 %')

如果找到字符串则返回true,否则返回false,“%”是clickhouse中的regex通配符。由于multif在第一次匹配时停止,因此您将无法获得两个具有相同值的提取字符串。

332nm8kg

332nm8kg2#

找到了!

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

(没有cast,我是receive-exeption:db::exception:unexpected type of filter column.,奇怪…)

相关问题