0

我使用 Microsoft SQL Server 2008 尝试识别数据点的时间顺序,以创建一个过滤字段,该字段允许我创建一个查询,该查询仅包含每个 ID 号的第一条和最后一条记录,其中多行代表不同的数据来自同一 ID 的积分

这是我当前数据和所需数据的示例,以便更好地理解我的意思:

当前数据

ID    Indicator        Date
1       1           1988-02-11
1       1           1989-03-9
1       1           1993-04-3
1       1           2001-05-4
2       1           2000-01-01
2       1           2001-02-03
2       1           2002-04-22
3       1           1990-02-01
3       1           1998-02-01  
3       1           1999-03-02
3       1           2000-04-02
4       0               NA

所需数据

ID    Indicator    Date        Order_Indicator
1       1       1988-02-11        1
1       1       1989-03-9         2
1       1       1993-04-3         3
1       1       2001-05-4         4
2       1       2000-01-01        1
2       1       2001-02-03        2
2       1       2002-04-22        3
3       1       1990-02-01        1
3       1       1998-02-01        2
3       1       1999-03-02        3
3       1       2000-04-02        4
4       0       NULL             NULL

我要创建的字段是“Desired Data”表中的“Order_Indicator”字段,唯一相关的记录是 Indicator = 1 的记录。有了这些信息,我将创建一个查询,我只选择 Order_Indicator = 1 的行对于共享相同 ID 的每个“行组”,Order_Indicator = MAX(Order_Indicator)。有谁知道我该怎么做?我知道我可以在 Excel 中很容易地做到这一点,但我需要在 SQL Server 上做到这一点,以便我的同事可以重现它。

非常感谢您!

4

2 回答 2

1

您可以使用排名函数执行此操作:

select c.*,
       (case when indicator = 1
             then row_number() over (partition by id, indicator order by [date])
        end) as OrderIndicator
from current c

这会根据日期和指示符分配一个序号。case 语句处理指示符 = 0 的情况。

顺便说一句,这假设“日期”被存储为日期。

于 2012-08-27T21:48:01.733 回答
0

使用以下查询:

select YourTable.ID,
       YourTable.indicator,
       case when date<>'NA' then date end as date,
       case when indicator = 1 then row_number() over (partition by id, indicator order by ID) end as Order_Indicator
from YourTable
于 2012-08-28T08:48:16.743 回答