序号从设定值开始

时间:2016-02-29 15:06:58

标签: sql-server tsql sequence

我想从设定值添加序列nr。

输出可能吗?

p_id    date          days     OUTPUT(what i want)
3385    2012-02-02    556      0
3385    2012-02-03     1       1
3385    2012-09-24     234     0
3385    2012-09-25     1       1
3385    2013-11-12     413     0
3385    2013-11-13     1       1
3385    2013-11-14     1       2
3385    2013-11-15     1       3
3385    2014-09-09     298     0
3385    2014-09-10     1       1
3385    2014-09-11     1       2
3385    2015-11-11     426     0
3385    2015-11-12     1       1
3385    2015-11-13     1       2
3385    2015-11-14     1       3
3385    2015-11-15     1       4
3385    2015-11-16     1       5
3385    2015-11-17     1       6
3385    2015-11-18     1       7
3385    2015-11-19     1       8
3385    2015-11-20     1       9

天数栏计算从该行开始的天数。

如果天数值大于5则开始新的" 0"然后是一个新的序列号。

1 个答案:

答案 0 :(得分:5)

试试这个:

SELECT p_id, [date], days,
       ROW_NUMBER() OVER (PARTITION BY p_id, grp 
                          ORDER BY [date]) - 1 AS [OUTPUT]
FROM (
  SELECT p_id, [date], days, 
         SUM(IIF(days > 5, 1, 0)) OVER (PARTITION BY p_id
                                        ORDER BY [date]) AS grp
  FROM mytable ) AS t

<强>解释

内部查询使用SUM() OVER()生成以下输出:

p_id    date        days    grp
===============================
3385    2012-02-02  556     1
3385    2012-02-03  1       1
3385    2012-09-24  234     2
3385    2012-09-25  1       2
3385    2013-11-12  413     3
3385    2013-11-13  1       3
3385    2013-11-14  1       3
3385    2013-11-15  1       3
3385    2014-09-09  298     4
3385    2014-09-10  1       4
3385    2014-09-11  1       4
3385    2015-11-11  426     5
3385    2015-11-12  1       5
3385    2015-11-13  1       5
3385    2015-11-14  1       5
3385    2015-11-15  1       5
3385    2015-11-16  1       5
3385    2015-11-17  1       5
3385    2015-11-18  1       5
3385    2015-11-19  1       5
3385    2015-11-20  1       5

grp字段实际上是&#39;大于5&#39; 出现的运行总计。在外部查询中使用此字段,我们可以使用ROW_NUMBER窗口函数轻松生成所需的枚举。