SQL Server 2008R2:组号

时间:2013-11-05 23:15:33

标签: sql sql-server sql-server-2008-r2

您好!

我在表格中列出了以下数据的前两列(让我们称之为storico):

IdZona  Inizio      number
24      1985-03-01    1
81      1988-12-01    2
21      1990-01-01    3
21      1992-02-01    3
79      1996-01-01    4
21      1996-11-01    5
21      1999-02-01    5 
21      2005-01-01    5 
21      2008-12-01    5

因此必须按日期排序数据(" inizio")。对于每个日期,IdZona都有一定的价值。 我想知道的是如何获得SQL Server 2008 R2计算的第三列。 每次检测到列idZona中的另一个值时,该数字必须增加。当返回已经给出idZona的值时(p.e.se line 1996-11-01),[number]值不得报告已经显示的值,而是增加另一个时间。

希望,任务很明确。

提前致谢,

克劳斯

1 个答案:

答案 0 :(得分:2)

这有点令人费解,但递归CTE可以做到这一点。

如果保证日期是唯一的,可以使其更简单。

这也是用光标迭代可能更快更清晰的场合之一。

With x as (
    Select Top 1 
        IdZona,
        Inizio,
        1 [number]
    From
        dbo.Storico
    Order By
        Inizio,
        IdZona
    Union All
    select
        y.IdZona,
        y.Inizio,
        y.[number]
    from (
        select
            s.IdZona,
            s.Inizio,
            case 
                when s.IdZona = x.IdZona Then x.[number] 
                else x.[number] + 1 
            end [number],
            row_number() over (order by s.Inizio, s.IdZona) rn
        From
            dbo.Storico s,
            x
        Where
            s.Inizio > x.Inizio or (
                s.Inizio = x.Inizio and 
                s.IdZona > x.idZona
            )
        ) y
    Where
        y.rn = 1
)           
Select 
    * 
From 
    x

<强> Example SQLFiddle