2017-06-12 18 views
1

私はClickHouseの初心者で、私たちのプロジェクトの統計処理に使用しようとしています。デスクトップソフトウェアの中には、当社のサーバーに情報を送信するものがあるため、運用システムを短いリストにグループ化する必要があります。この例クエリ:ClickHouseのCoalesce機能の置き換え

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

私は私の場合は使用する必要がどのような機能?ありがとう。

答えて

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 else ifであり、好きなだけ多くの値を追加することができます。私はあまり書く必要がないため、2つを使用しましたが、必要なすべてのOS値を追加するだけです。その少し冗長だが、それは仕事を完了する。

機能:

like(OS, '% 2008 R2 %') 

trueを返した文字列を別の方法で見つけるとfalseの場合、 "%" はclickhouseで正規表現のワイルドカードです。 multifが最初のマッチで停止するので、同じ値で2つの抽出された文字列を取得することはありません。

関連する問題