我正在努力改进我继承的一些查询,并且如果有可能执行以下操作则很奇怪 - 给出一个如下所示的表the_table
:
id uri
---+-------------------------
1 /foo/bar/x
1 /foo/bar/y
1 /foo/boo
2 /alpha/beta/carotine
2 /alpha/delic/ipa
3 /plastik/man/spastik
3 /plastik/man/krakpot
3 /plastik/man/helikopter
作为一个隐含的中间步骤,我希望将它们分组为uri
的第1 + 2个元组。该步骤的结果如下:
id base
---+---------------
1 /foo/bar
1 /foo/boo
2 /alpha/beta
2 /alpha/delic
3 /plastik/man
最终结果将反映每个唯一id
的唯一tuple1 + tuple2值的数量:
id cnt
---+-----
1 2
2 2
3 1
我可以实现这些结果,但不能没有做一个子查询(以获得上面提到的隐式步骤的结果),然后选择/分组。类似的东西:
SELECT
id,
count(base) cnt
FROM (
SELECT
id,
substring_index(uri, '/', 3) AS base
FROM the_table
GROUP BY id, base
)
GROUP BY id;
我想避免子查询的原因是我使用了相当大的(20M行)数据集,并且子查询变得非常昂贵。 Gut告诉我这不可行,但我想问我......
答案 0 :(得分:2)
不需要子查询 - 您可以count
使用distinct
来获得相同的结果:
SELECT
id,
count(distinct substring_index(uri, '/', 3)) AS base
FROM the_table
GROUP BY id
顺便说一句 - 对于身份3,这会返回1的计数 - 我认为这是您帖子中的拼写错误。