Sql 如何在不使用滞后函数的情况下对这些数据进行分组

Sql 如何在不使用滞后函数的情况下对这些数据进行分组,sql,sql-server-2008,Sql,Sql Server 2008,我的数据集如下所示。从这里,我想从每个组中选择第一行,其中PersonIDs状态已更改为与前一行不同的状态 例如,从这个数据集中,我想要第1、4、7和11行。 有什么帮助吗? 如果我做一个GROUPBY,它只是将所有新的和所有挂起的数据集中在两个组中。我只有SQLServer2008,所以滞后函数不起作用 PersonID Status WhenChanged 101 New 27/01/2017 15:27 101 New 27/01/2

我的数据集如下所示。从这里,我想从每个组中选择第一行,其中PersonIDs状态已更改为与前一行不同的状态

例如,从这个数据集中,我想要第1、4、7和11行。 有什么帮助吗? 如果我做一个GROUPBY,它只是将所有新的和所有挂起的数据集中在两个组中。我只有SQLServer2008,所以滞后函数不起作用

PersonID    Status  WhenChanged
101         New     27/01/2017 15:27
101         New     27/01/2017 16:40
101         New     27/01/2017 16:40
101         Pending 27/01/2017 16:40
101         Pending 27/01/2017 16:40
101         Pending 27/01/2017 16:40
101         New     31/01/2017 09:14
101         New     31/01/2017 10:02
101         New     31/01/2017 10:03
101         New     31/01/2017 10:05
101         Pending 03/02/2017 14:29
101         Pending 03/02/2017 14:29

您可以通过将
行编号()
与另一个
行编号()
进行差异来完成此操作:

为了理解这是如何工作的,我建议您运行子查询并查看结果。这些行号之间的差异定义了组


另一种方法是使用
外部应用
。但是,上述方法可能具有更好的性能。

您可以通过将
行数()
与另一个
行数()
进行比较来实现这一点:

为了理解这是如何工作的,我建议您运行子查询并查看结果。这些行号之间的差异定义了组


另一种方法是使用
外部应用
。但是,以上可能具有更好的性能。

当您的
发生严重更改时,
是否为
VARCHAR
值…?对于您的结构,这是不可能的。您的日期时间值(看起来像
VARCHAR
)不是唯一的。你没有什么可归类的。如果没有任何东西可以对这些结果进行排序,就无法保证结果的顺序。这样,就不可能得到你想要的结果。您需要记录的唯一id。当您的
发生严重更改时,您的
是否是
VARCHAR
值…?对于您的结构,这是不可能的。您的日期时间值(看起来像
VARCHAR
)不是唯一的。你没有什么可归类的。如果没有任何东西可以对这些结果进行排序,就无法保证结果的顺序。这样,就不可能得到你想要的结果。您需要记录的唯一id。
select PersonID, Status, WhenChanged
from (select t.*,
             row_number() over (partition by personid, status, seqnum_p - seqnum_ps
                                order by whenchanged
                               ) as seqnum
      from (select t.*,
                   row_number() over (partition by personid order by whenchanged) as seqnum_p,
                   row_number() over (partition by personid, status order by whenchanged) as seqnum_ps
            from t
           ) t
     ) t
where seqnum = 1;