2017-06-12 540 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在第一次匹配時停止,因此不會在同一個值中獲取兩個提取的字符串。