Sql 基于状态更改的分组

Sql 基于状态更改的分组,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有如下示例,我想对数据更改的数据进行分组 My table: id Status time 1 a 20/6/2015 8:00 2 a 20/6/2015 8:46 3 a 20/6/2015 9:00 4 b 20/6/2015 9:00 5 b 20/6/2015 9:16 6 a 20/6/2015 9:17 7 a 21/6/2015 9:20 样本输出: Status mint

我有如下示例,我想对数据更改的数据进行分组

My table:
id  Status  time
1   a      20/6/2015 8:00
2   a      20/6/2015 8:46
3   a      20/6/2015 9:00
4   b      20/6/2015 9:00
5   b      20/6/2015 9:16
6   a      20/6/2015 9:17
7   a      21/6/2015 9:20
样本输出:

Status  mintime          maxtime
a      20/6/2015 8:00   20/6/2015 9:00
b      20/6/2015 9:00   20/6/2015 9:16
a      20/6/2015 9:17   21/6/2015 9:20
基本上,我想对状态数据进行分组,仅当状态发生变化时,才使用数据的最小和最大时间

我的问题是,如果我在状态列上使用分组,那么我将得到如下结果 状态mintime maxtime

a   20/6/2015 8:00  21/6/2015 9:20
b   20/6/2015 9:00  20/6/2015 9:16

我不希望像上面那样的输出返回2个数据。我希望根据状态更改对数据进行分组。

您可以使用不同的行数方法来完成此操作。
row\u number()
(带有特定参数)的差异标识组。剩下的只是聚合:

select status, min(time), max(time)
from (select t.*,
             (row_number() over (order by time) -
              row_number() over (partition by status order by time)
             ) as grp
      from mytable t
     ) t
group by status, grp;

在保持行顺序的同时进行分组是相当棘手的。你能详细解释一下为什么这很有用,看看是否有其他方法可以完成这项工作吗?你能解释一下,如何用其他方法完成这项工作吗?如果我知道你需要什么,而不是你认为最好的解决方法,我或其他人可能会这样做。(另请参阅)是的,我只希望解决问题的方法而不是解决我的问题。到目前为止,我可以考虑使用游标,在临时表中检查状态更改过程,并将其显示给应用程序。但是我想知道有没有其他的方法可以优化