【问题标题】:Teradata - Counting previous valuesTeradata - 计算以前的值
【发布时间】:2018-12-10 21:16:58
【问题描述】:

我正在尝试将查询中的先前值相加,作为完成另一项任务的中间步骤。我想总结以前的值3, 例如

Type   value
A        3 
A        3
A        3
A        3
A        3
A        3
A        3
B        2.3
B        2.3 
B        3
B        2.3 
B        2.3 
B        3
B        2.3

我的理想答案是

Type   value   Previous 3's
A        3             0
A        3             1 
A        3             2
A        3             3
A        3             4
A        3             5
A        3             6
B        2.3           7
B        2.3           7
B        3             7
B        2.3           8
B        2.3           8
B        3             8
B        2.3           9

如何在 Teradata 或 SQL 中实现这一点?

【问题讨论】:

  • SQL 表代表 无序 集。您需要一个指定顺序的列。

标签: sql count sum teradata


【解决方案1】:

SQL 表代表无序 集合。要计算以前的值,您需要一列指定顺序,而您的问题中没有。

您可以使用累积计数或总和:

select t.*,
       count(case when value = 3 then 1) over
           (order by ? rows between unbounded preceding and 1 preceding)
from t;

? 用于指定排序的列。

【讨论】:

    【解决方案2】:

    你至少可以在 MYSQL 中实现这一点:

    create table teadata(Type varchar(1), value number);
    insert into teadata(Type, value) values('A', 3);
    insert into teadata(Type, value) values('A', 3);
    insert into teadata(Type, value) values('A', 3);
    insert into teadata(Type, value) values('B', 3);
    insert into teadata(Type, value) values('B', 2.3);
    
    select type, value, (@sum := @sum + (case when value = 3 then 1 else 0 end)) as cumesum 
        from teadata t cross join (select @sum := 0) params;
    

    这将打印:

    +------+-------+---------+
    | type | value | cumesum |
    +------+-------+---------+
    | A    |     3 |       1 |
    | A    |     3 |       2 |
    | A    |     3 |       3 |
    | B    |     3 |       4 |
    | B    |   2.3 |       4 |
    +------+-------+---------+
    

    在这种情况下,诀窍是使用变量@sum 和case 语句。这适用于 MySQL。不确定 Teradata。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-15
      • 2018-08-17
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多