Получить сумму цифр в строке структуры ключ / значение - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть строки в базе данных vertica, такие как:

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

и мне нужно извлечь из него цифры и получить сумму. Таким образом, вывод должен быть:

17 

(рассчитано 2 + 5 + 10)

Мне это нужно для работы в Таблице. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Два шага, используя функцию SPLIT_PART, я думаю:

а) Вертикализуйте вашу строку в ряды.

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
;
0 голосов
/ 05 ноября 2018

Хотя изменение модели данных сделает вашу жизнь намного проще, ваш сценарий может быть обработан с использованием одних только вычислений в таблице.

  1. Заменить ':' на ','. Это можно сделать с помощью следующего расчета.

enter image description here

  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 на ноль, так что нам не нужно беспокоиться о пропущенных разбиениях. Мы просто берем альтернативные поля и конвертируем их в целые числа. enter image description here

Вот окончательный результат:

enter image description here

...