Redshift SQL:在另一列中给定条件的列计数匹配行

Redshift SQL: Column Counting Matching Rows Given a Condition within another column

我有一个包含两列的 table,用户 ID 和字符串。我想添加第三列,用于计算第二列中以任何给定行中的整个字符串值开头的字符串数。每个用户只有一行。

目标是得到如下table结构:

这里的计数等于字符串列中以该行中的给定值开头的行数。我试过将 count(string like string + '%') 与 over(partition by string) 结合使用,但它似乎并没有像我希望的那样工作。

感谢任何帮助(顺便说一句,我在 Redshift 上使用 SQL)。

具有相关子查询:

SELECT t1.ID, t1.String, 
       (SELECT COUNT(*) FROM tablename t2 WHERE t2.String LIKE CONCAT(t1.String, '%')) AS Count
FROM tablename t1

或者,使用自连接:

SELECT t1.ID, t1.String, COUNT(*) AS Count
FROM tablename t1 INNER JOIN tablename t2
ON t2.String LIKE CONCAT(t1.String, '%')
GROUP BY t1.ID, t1.String

参见demo

结果:

id string count
1 a 3
2 ab 2
3 abc 1
4 d 3
5 de 2
6 def 1

Redshift 中最快的方法可能是使用 window 函数。但是,它需要很冗长——因为每个字符串长度都需要一个单独的列:

select t.*,
       (case when string = string_1
             then count(*) over (partition by string_1)
             when string = string_2
             then count(*) over (partition by string_2)
             when string = string_3
             then count(*) over (partition by string_3)
        end)
from (select t.*,
             left(string, 1) as string_1,
             left(string, 2) as string_2,
             left(string, 3) as string_3
      from t
     ) t;

嗯。 . .不需要子查询:

select t.*,
       (case len(string)
             when 1 then count(*) over (partition by left(string, 1))
             when 2 then count(*) over (partition by left(string, 2))
             when 3 then count(*) over (partition by left(string, 3))
        end)
from t;