Sql 如何在不使用滞后函数的情况下对这些数据进行分组
我的数据集如下所示。从这里,我想从每个组中选择第一行,其中PersonIDs状态已更改为与前一行不同的状态 例如,从这个数据集中,我想要第1、4、7和11行。 有什么帮助吗? 如果我做一个GROUPBY,它只是将所有新的和所有挂起的数据集中在两个组中。我只有SQLServer2008,所以滞后函数不起作用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
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;