Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 红移,在用逗号分隔的列中计数项目_Sql_Amazon Redshift - Fatal编程技术网

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。谢谢(抱歉有点晚了)很好的解决方案,蒂姆。谢谢(抱歉有点晚了)