【问题标题】:Coalesce function replacing in ClickHouseClickHouse 中的合并功能替换
【发布时间】:2017-06-12 08:04:30
【问题描述】:

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

在我的情况下我需要使用什么功能?谢谢。

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    你需要的是一个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,您可以添加任意数量的值,我只使用了这两个,因为我不想写太多,但在您的情况下,只需添加您需要的所有 OS 值。它有点冗长,但它完成了工作。

    功能:

    like(OS, '% 2008 R2 %') 
    

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

    【讨论】:

      【解决方案2】:

      找到了!

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

      (没有 CAST 我收到异常:DB::Exception: Unexpected type of filter column.,奇怪...)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-11
        • 2019-05-14
        • 2021-01-09
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 2019-08-17
        • 2013-05-18
        相关资源
        最近更新 更多