2016-10-04 9 views
6

私はプレストを使用しています。私は数値のIDフィールドを持っています。 ID内に数字を追加する列が必要です。したがってID = 1234の場合、10、つまり1 + 2 + 3 + 4を出力する列が必要です。SQLサマリー数字の数字

部分文字列を使用して各桁を抽出して合計することはできますが、使用する方法やシンプルな方法がありますか?

+0

が多分に[ 'slice'](https://prestodb.io/docs/current/functions/array.html)配列を生成し、配列の値を単純に合計しますか? – xQbert

答えて

0

質問を正しく読んでいる場合は、substring (ID,1,1) + substring (ID,2,1) + ...substring (ID,n,1)のように、IDの各数字の部分文字列グラブをハードコードする必要がないようにします。あなたのすべてのID値が同じ長さであれば、それはうらやましく動作します。

代わりに、再帰的なCTEを使用することができます。このようにすると、可変長のIDフィールドでも機能します。

免責事項:これはまだ技術的にsubstringを使用しないが、それは不器用打ちのグラブ

WITH recur (ID, place, ID_sum) 
AS 
(
    SELECT ID, 1 , CAST(substring(CAST(ID as varchar),1,1) as int) 
    FROM SO_rbase 
UNION ALL 
    SELECT ID, place + 1, ID_sum + substring(CAST(ID as varchar),place+1,1) 
    FROM recur 
    WHERE len(ID) >= place + 1 
) 

SELECT ID, max(ID_SUM) as ID_sum 
FROM recur 
GROUP BY ID 
0

文字列を分割するために最初に使用REGEXP_EXTRACT_ALLを行いません。次に、CROSS JOIN UNNEST GROUP BYを使用して、抽出された数字を数字と合計でグループ化します。ここで

WITH my_table AS (SELECT * FROM (VALUES ('12345'), ('42'), ('789')) AS a (num)) 
SELECT 
    num, 
    SUM(CAST(digit AS BIGINT)) 
FROM 
    my_table 
CROSS JOIN 
    UNNEST(REGEXP_EXTRACT_ALL(num,'\d')) AS b (digit) 
GROUP BY 
    num 
; 
1

あなたは最近、プレストに追加lambdaサポート付き@ akuhnの答えからregexp_extract_allを組み合わせることができます。そうすれば、unnestは必要ありません。コードは実際に自明でない場合にとvarcharからcastが必要になります:

presto> select 
    reduce(
     regexp_extract_all(cast(x as varchar), '\d'), -- split into digits array 
     0, -- initial reduction element 
     (s, x) -> s + cast(x as integer), -- reduction function 
     s -> s -- finalization 
    ) sum_of_digits 
from (values 1234) t(x); 

sum_of_digits 
--------------- 
      10 
(1 row) 
関連する問題