【问题标题】:Count occurrences based on user defined criteria across multiple columns根据用户定义的标准跨多列计算出现次数
【发布时间】:2019-07-12 18:31:00
【问题描述】:

我需要编写一个查询来生成频率表。目前我正在研究亚马逊红移数据库。我生成了一个如下所示的表格:

user_id   user_label     code1  code2  code_3  date    
------   -----------    -----  -----  ------  -------
1        x              a      b      c       01-01
1        x              a      d      c       01-01
1        x              a      b      c       01-02
1        y              a      c      d       01-01
2        x              a      b      d       01-01

等

计算出现次数的规则是,如果两行具有相同的 id 和 date,则重复代码应仅计算一次。
例如,对于前两行,频率表应该是:

user_id      user_label   a   b   c   d 
--------     -----------  --  --  --  -- 
1            x            1   1   1   1

因为即使 a 和 c 有两个实例,但它们发生在同一日期,所以应该只计算一次,我需要为 user_id + user_label 的每个唯一组合执行此操作

那么在处理完第三行之后,频率表应该是:

user_id      user_label   a   b   c   d 
--------     -----------  --  --  --  -- 
1            x            2   2   2   1

因为第三行有不同的日期,因此 a,b,c 的计数应该增加 1

最后,对于上面给出的示例表,期望的结果应该是

user_id      user_label   a   b   c   d 
--------     -----------  --  --  --  -- 
1            x            2   2   2   1
1            y            1   1   1   0
2            x            1   1   0   1   

我知道我应该把到目前为止我尝试过的东西放在一起,但我真的不知道从哪里开始。 这不是家庭作业问题,任何提示或建议将不胜感激。

【问题讨论】:

  • 根据您的问题,我将标签更改为 amazon-redshift。

标签: sql amazon-redshift


【解决方案1】:

你似乎想要一个有条件的count(distinct):

select user_id, user_label,
       count(distinct case when 'a' in (code1, code2, code3) then date end) as a,
       count(distinct case when 'b' in (code1, code2, code3) then date end) as b,
       count(distinct case when 'c' in (code1, code2, code3) then date end) as c,
       count(distinct case when 'd' in (code1, code2, code3) then date end) as d
from t
group by user_id, user_label

【讨论】:

  • 嗨,戈登,非常感谢您的快速回复。我会接受你的回答只是一个后续问题,我的表目前有数千列,我认为在 select 语句中添加每一列是不切实际的,有没有办法让这个工作与数千或数万列数?
  • @ZhezhongJian . . .不是没有写一个长查询。水平存储数据会引入这个问题。最好将重复值放在行中,而不是列中。
  • 因此,如果我确实更改表以将重复值存储在行中,如何根据需要生成频率表?如果你不介意我问,你会如何解决这个问题......我真的被困住了
  • @ZhezhongJian . . .这将是一个新问题,应该作为问题而不是评论提出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多