我有一个表,将日志(log)存储到一行中.我取消了它的嵌套,其中一个示例行如下所示:

TestWatch(2)TestFragment(1)TestView(1)TestNotiments(2)TestActivity(1)等等.

我想将TestWatch、TestFragment等传递到列中,并将它的值(2)、(1)等传递到它的行中.有很多这样的测试日志(log),并不是固定的数量.它们之间没有分隔符.我还想对每一行中发现的每个TestWatch、TestFragment等值求和.

我怎样才能做到这一点呢?

我试着修剪和拆分,但结果并不像预期的那样.

推荐答案

假设您的日志(log)中的术语之间没有一致的分隔符(甚至没有空格),我们仍然可以通过使用BigQuery中的REGEXP_EXTRACT_ALL()函数和UNNEST运算符来获得您想要的结果.

步骤1.使用regex_replace()移动日志(log)中的所有空格

步骤2.使用REGEXP_EXTRACT_ALL()将每个(Term(Quantity))标记提取到一个数组中.

步骤3.将数组转换为每行一个(项(数量))令牌

步骤4.使用regex_extract()分别获取期限和数量.请注意,我们需要使用negative lookaround regex(?=和?<;=)来获取我们需要的有关期限和数量的准确数据.

步骤5.按项分组,并在数量上求和(),以获得结果.

请参阅以下代码作为示例:

WITH log_extracted AS (
  SELECT
    REGEXP_EXTRACT_ALL(
      REGEXP_REPLACE(
        'TestObserver(2) TestFragment(1) TestView(1) TestNotifications(2) TestActivity(1)',
        '_',
        ''
      ),
      '\w+\(\d+\)'
    ) AS log_tokens
)
SELECT
  REGEXP_EXTRACT(log_token, '(\w+)(?=\(\d+\))') AS term,
  SUM(CAST(REGEXP_EXTRACT(log_token, '(?<=\w\()\d+') AS INT64)) AS quantity
FROM log_extracted
CROSS JOIN UNNEST(log_tokens) AS log_token
GROUP BY
  1

输出示例:

term quantity
TestFragment 1
TestView 1
TestObserver 2
TestNotifications 2
TestActivity 1

Sql相关问答推荐

如何在PostgreSQL中同时为id s列表执行多个update语句?'

SQL更新,在2个额外的表上使用内部连接

在SQL中将相同且紧挨着的元素进行分组

将主表与历史表连接以获取主表的当前汇率以及历史表中的上一个和最后一个汇率

SQL将 Select 查询作为新列添加到另一个 Select 查询

如何在Presto中将多个列合并到一个数组中

从依赖于其他表的值的XREF表中的值分组获得正确的计数?

连接三个表的正确方式是什么?在这三个表中,可以显示在一个表上的行将在其他表中显示结果

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

PostgreSQL 9.6嵌套的INSERT/RETURN语句的CTE性能低得令人无法接受

按日期时间(不包括秒)连接表

根据具有特定值的 ID 创建自定义组

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

MariaDB非常简单的MATCHAGAINST查询不使用FULLTEXT索引吗?

强制 SQL 始终通过 R 从视图中返回至少一行

为什么 get_json_object() 无法从存储在 Hive SQL 表中的 JSON 中提取值?

在 postgresql 中,我可以将其组合成一个查询吗?

如何更改 duckdb R 中的数据约束

查找具有相同连接列数据的所有记录

BigQuery 将一行拆分为多列