SQL:根据Criteria计算Max值

时间:2014-08-05 00:50:50

标签: sql sql-server-2008 max

我有一个具有以下属性的表

  1. 用户名:标识符
  2. 序列:这是一个指示事件序列的有序列表
  3. 聚合:这也是顺序的。例如,如果对特定事件采取了响应,则存在一个值(1表示第一个动作,2表示第二个动作,...,0表示没有对该事件采取任何动作)。
  4. 我需要添加另一列,用相同的用户替换0到最大值,直到该点。例如,请参见第二个表。例如,即使事件3没有采取任何措施,但到目前为止还有2个动作,因此2应该是与该行相关的值。

    运行SQL Server 2008 R2

    | Username  | Seq | Agg|
    ------------------------
    | Username1 |  1  | 1  |
    | Username1 |  2  | 2  |
    | Username1 |  3  | 0  |
    | Username1 |  4  | 0  | 
    | Username1 |  5  | 3  |
    
    
    
    | Username  | Seq | Agg| Act|
    -----------------------------
    | Username1 |  1  | 1  | 1  |
    | Username1 |  2  | 2  | 2  |
    | Username1 |  3  | 0  | 2  |
    | Username1 |  4  | 0  | 2  |
    | Username1 |  5  | 3  | 3  |
    

1 个答案:

答案 0 :(得分:2)

SQL的大多数方言都支持ANSI标准窗口函数。你还没有提到哪个数据库,所以我们假设你使用的是:

select a.*,
       max(agg) over (partition by username order by seq) as act
from atable a;

如果您的数据库不支持窗口函数(或累积最大值),则可以使用相关子查询执行此操作:

select a.*
       (select max(a2.agg)
        from atable a2
        where a2.id <= a.id
       ) as act
from atable a;