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;
我有一个包含两列的 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;