Sql 红移,在用逗号分隔的列中计数项目
我有数据表明一列保存了一组数字Sql 红移,在用逗号分隔的列中计数项目,sql,amazon-redshift,Sql,Amazon Redshift,我有数据表明一列保存了一组数字 | user | col | | ------- | ------- | | 1 | 3,7,11,25,44,56,77,32,34,55 | | 2 | 3,7,25,44,37,89,56,99,103,13 | | 1 | 3,10,11,25,44,56,33,32,34,55 | 我知道我可以拆分列并计数,但是我们
| user | col |
| ------- | ------- |
| 1 | 3,7,11,25,44,56,77,32,34,55 |
| 2 | 3,7,25,44,37,89,56,99,103,13 |
| 1 | 3,10,11,25,44,56,33,32,34,55 |
我知道我可以拆分列并计数,但是我们有什么不同的方法来计数吗
|user| new-col | count|
| ------- | ------- |
| 1 | 3 | 2 |
| 1 | 7 | 1 |
| 1 | 11 | 2 |
| 1 | 25 | 2 |
| 1 | 44 |2 |
| 1 | 56 |1 |
| 1 | 77 | 1 |
| 1 | 32 | 2 |
这回答了问题的原始版本 可以使用以下命令计算逗号分隔值的数量:
select (case when col = '' then 0
else length(col) - length(replace(col, ',', '')) + 1
end) as values_count
from t;
也就是说,您应该修复数据模型,这样就不会在一列中存储多个值。尤其令人讨厌的是,您还将数字存储为字符串。您需要一个连接/关联表。这回答了问题的原始版本 可以使用以下命令计算逗号分隔值的数量:
select (case when col = '' then 0
else length(col) - length(replace(col, ',', '')) + 1
end) as values_count
from t;
也就是说,您应该修复数据模型,这样就不会在一列中存储多个值。尤其令人讨厌的是,您还将数字存储为字符串。您需要一个连接/关联表。您可以将联合查询与
分割部分一起使用:
WITH cte AS (
SELECT user, SPLIT_PART(col, ',', 1) AS val FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 2) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 3) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 4) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 5) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 6) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 7) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 8) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 9) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 10) FROM yourTable
)
SELECT
user,
val,
COUNT(*) AS cnt
FROM cte
GROUP BY
user,
val;
但请注意,我们在上述CTE中所做的一切实际上只是规范化您的数据,以便每个用户-值关系占用一个单独的记录。理想情况下,您应该更改表的设计,不再存储CSV
如果您只需要每个用户的数字,请使用:
SELECT
user,
COUNT(*) AS cnt
FROM cte
GROUP BY
user;
您可以将union查询与SPLIT\u PART
一起使用:
WITH cte AS (
SELECT user, SPLIT_PART(col, ',', 1) AS val FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 2) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 3) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 4) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 5) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 6) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 7) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 8) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 9) FROM yourTable UNION ALL
SELECT user, SPLIT_PART(col, ',', 10) FROM yourTable
)
SELECT
user,
val,
COUNT(*) AS cnt
FROM cte
GROUP BY
user,
val;
但请注意,我们在上述CTE中所做的一切实际上只是规范化您的数据,以便每个用户-值关系占用一个单独的记录。理想情况下,您应该更改表的设计,不再存储CSV
如果您只需要每个用户的数字,请使用:
SELECT
user,
COUNT(*) AS cnt
FROM cte
GROUP BY
user;
询问
询问
使用REGEXP\u Count
计算字符串中的逗号数,然后加1
CREATE TEMP TABLE examples (
user_id INT
, value_list VARCHAR
);
INSERT INTO examples
SELECT 1 , '3,7,11,25,44,56,77,32,34,55'
UNION ALL SELECT 2 , '3,7,25,44,37,89,56,99,103,13'
UNION ALL SELECT 1 , '3,10,11,25,44,56,33,32,34,55'
;
SELECT user_id
, SUM(REGEXP_COUNT(value_list,',')+1) value_count
FROM examples
GROUP BY 1
;
输出
user_id | value_count
---------+-------------
1 | 20
2 | 10
使用REGEXP\u Count
计算字符串中的逗号数,然后加1
CREATE TEMP TABLE examples (
user_id INT
, value_list VARCHAR
);
INSERT INTO examples
SELECT 1 , '3,7,11,25,44,56,77,32,34,55'
UNION ALL SELECT 2 , '3,7,25,44,37,89,56,99,103,13'
UNION ALL SELECT 1 , '3,10,11,25,44,56,33,32,34,55'
;
SELECT user_id
, SUM(REGEXP_COUNT(value_list,',')+1) value_count
FROM examples
GROUP BY 1
;
输出
user_id | value_count
---------+-------------
1 | 20
2 | 10
您的预期输出是什么?我需要找到每个用户的col中每个计数的数字。我有一个想法,要知道每一个结果number@Axis请编辑您的问题以向我们显示您所需的输出,例如您提供的数据。@johb Rotenstein问题已更新。我试图避免使用Union表,因为我有一个大表。您的预期输出是什么?我需要找到每个用户col中的每个计数数字。我有一个想法,要知道每一个结果number@Axis请编辑您的问题以向我们显示您所需的输出,例如您提供的数据。@johb Rotenstein问题已更新。我尽量避免使用Union表,因为我有一个大表。对不起,@Gordon表示困惑,我需要计算每个用户的每个分隔数字。比如,3算了两次user1@Axis . . . 修正你的数据模型!对不起,@Gordon搞混了,我需要计算每个用户的每个独立数字。比如,3算了两次user1@Axis . . . 修正你的数据模型!伟大的解决方案,@Tim。谢谢(抱歉有点晚了)很好的解决方案,蒂姆。谢谢(抱歉有点晚了)