私はプレストを使用しています。私は数値のIDフィールドを持っています。 ID内に数字を追加する列が必要です。したがってID = 1234の場合、10、つまり1 + 2 + 3 + 4を出力する列が必要です。SQLサマリー数字の数字
部分文字列を使用して各桁を抽出して合計することはできますが、使用する方法やシンプルな方法がありますか?
私はプレストを使用しています。私は数値のIDフィールドを持っています。 ID内に数字を追加する列が必要です。したがってID = 1234の場合、10、つまり1 + 2 + 3 + 4を出力する列が必要です。SQLサマリー数字の数字
部分文字列を使用して各桁を抽出して合計することはできますが、使用する方法やシンプルな方法がありますか?
質問を正しく読んでいる場合は、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
文字列を分割するために最初に使用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
;
あなたは最近、プレストに追加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)
が多分に[ 'slice'](https://prestodb.io/docs/current/functions/array.html)配列を生成し、配列の値を単純に合計しますか? – xQbert