在 ClickHouse 中合并函数替换
Coalesce function replacing in 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 函数,并尝试使用提取物按版本号识别 OS:
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 │
└─────────────────┴────────────────┘
我的情况需要使用什么功能?谢谢
找到了!
select OS, arrayFirst(x -> cast(position(OS, x) as UInt8), [' 8 ',' 8.1 ', '2008 R2', '2008'])
from Req
limit 1000;
(没有 CAST,我收到了异常:DB::Exception:过滤列的意外类型。,奇怪...)
这里你需要的是一个multif。
如果找到字符串“2012 R2”,return me that, if "2012" return me that...等等
所以在你的情况下你可以这样做:
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 %')
return如果找到字符串则为 true,否则为 false,“%”是 clickhouse 中的正则表达式通配符。由于 multif 在第一次匹配时停止,因此您不会得到两个具有相同值的提取字符串。
我是 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 函数,并尝试使用提取物按版本号识别 OS:
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 │
└─────────────────┴────────────────┘
我的情况需要使用什么功能?谢谢
找到了!
select OS, arrayFirst(x -> cast(position(OS, x) as UInt8), [' 8 ',' 8.1 ', '2008 R2', '2008'])
from Req
limit 1000;
(没有 CAST,我收到了异常:DB::Exception:过滤列的意外类型。,奇怪...)
这里你需要的是一个multif。
如果找到字符串“2012 R2”,return me that, if "2012" return me that...等等
所以在你的情况下你可以这样做:
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 %')
return如果找到字符串则为 true,否则为 false,“%”是 clickhouse 中的正则表达式通配符。由于 multif 在第一次匹配时停止,因此您不会得到两个具有相同值的提取字符串。