问题描述
我正在尝试动态获取子字符串并对其进行分组。因此,如果我的 uri
列包含以下记录:/uri1/uri2
和 /somelongword/someotherlongword
我希望将所有内容都设置为第二个分隔符,即最多第二个 /
并对其进行计数。我正在使用这个查询,但显然它是静态剪切字符串(第一个后 6 个字母)。
SELECT substr(uri,1,6) as URI,COUNT(*) as COUNTER
FROM staging
GROUP BY substr(uri,6)
ORDER BY COUNTER DESC
我怎样才能做到这一点?
解决方法
您可以组合使用 SUBSTRING()
和 POSITION()
架构:
CREATE TABLE Table1
(`uri` varchar(10))
;
INSERT INTO Table1
(`uri`)
VALUES
('some/text'),('some/text1'),('some/text2'),('aa/bb'),('aa/cc'),('bb/cc')
;
查询
SELECT
SUBSTRING(uri,1,POSITION('/' IN uri)-1),COUNT(*)
FROM Table1
GROUP BY SUBSTRING(uri,POSITION('/' IN uri)-1);
http://sqlfiddle.com/#!9/293dd3/3/0
编辑:在这里我找到了 amazon athena 文档:https://docs.aws.amazon.com/athena/latest/ug/presto-functions.html,这里是字符串函数文档:https://prestodb.io/docs/0.217/functions/string.html
我上面的答案仍然有效,但您可能需要将 SUBSTRING
更改为 SUBSTR
编辑 2:似乎在亚马逊雅典娜中有一个特殊的功能可以实现这一点,称为 SPLIT_PART()
查询:
SELECT SPLIT_PART(uri,'/',1),COUNT(*) FROM tbl GROUP BY SPLIT_PART(uri,1)
来自文档:
split_part(string,delimiter,index) → varchar
Splits string on delimiter and returns the field index. Field indexes start with 1. If the index is larger than than the number of fields,then null is returned.