获取 key/value 结构字符串中的数字总和

Get sum of digits in string of key/value structure

我在 vertica 数据库中有如下字符串:

'a18: 2, b34: 5, n29: 10'

我需要从中提取数字并求和。 所以输出应该是:

17 

(计算2+5+10)

我在 Tableau 中工作需要它。 我该怎么做?

虽然修改数据模型会让您的生活更轻松,但您的场景可以单独使用 Tableau 计算来处理。

  1. 将“:”替换为“,”。这可以使用以下计算来完成。

  1. 使用以下计算得出您的总数。 (这假定最多 5 个键值对。根据需要进行调整)
ZN(INT((TRIM( SPLIT( [Formatted String], ",", 2 ) ))))+
ZN(INT((TRIM( SPLIT( [Formatted String], ",", 4 ) ))))+
ZN(INT((TRIM( SPLIT( [Formatted String], ",", 6 ) ))))+
ZN(INT((TRIM( SPLIT( [Formatted String], ",", 8 ) ))))+
ZN(INT((TRIM( SPLIT( [Formatted String], ",", 10 ) ))))

这里ZN将NULL替换为零,这样我们就不用担心漏分了。我们只是采用替代字段并将它们转换为整数。

这是最终结果:

两步,使用SPLIT_PART函数,我认为:

a) 将您的字符串垂直成行。

b) 用冒号拆分结果字符串,将冒号后的标记转换为整数,然后对这些整数求和。

WITH  
-- this is your single-row input
-- if you have many rows, you will have to add any grouping column here                                                                                                                                                   
input(s) AS (
SELECT 'a18: 2, b34: 5, n29: 10'
)
,
-- start real WITH clause here ...
i(i) AS (
-- create 10 "index" integers out of nothing using TIMESERIES ...
 SELECT
   MICROSECOND(ts) AS i
 FROM (    SELECT TIMESTAMPADD(MICROSECOND,     1, '2000-01-01')
 UNION ALL SELECT TIMESTAMPADD(MICROSECOND,    10, '2000-01-01')
 ) limits(ts_lim)
 TIMESERIES ts AS '1 MICROSECOND' OVER (ORDER BY ts_lim)
)
,
-- verticalise your comma separated string
rows_obtained AS (
SELECT
  TRIM(SPLIT_PART(s,',',i)) AS row_obtained
FROM input CROSS JOIN i
WHERE SPLIT_PART(s,',',i) <> '' -- remove empty strings
--   you get:
--+   row_obtained
--+   a18: 2
--+   b34: 5
--+   n29: 10
)
-- get the sum of the second part of SPLIT_PART() by colon, cast to integer
SELECT
  SUM(SPLIT_PART(row_obtained,':',2)::INT) AS the_sum
FROM rows_obtained
;