Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL折叠数据_Sql_Sql Server_Gaps And Islands_Distinct Values - Fatal编程技术网

SQL折叠数据

SQL折叠数据,sql,sql-server,gaps-and-islands,distinct-values,Sql,Sql Server,Gaps And Islands,Distinct Values,我正在尝试折叠按日期排序的序列中的数据。在根据人员和类型分组时 数据存储在SQL server中,如下所示- seq person date type --- ------ ------------------- ---- 1 1 2018-02-10 08:00:00 1 2 1 2018-02-11 08:00:00 1 3 1 2018-02-12 08:00:00 1 4 1

我正在尝试折叠按日期排序的序列中的数据。在根据人员和类型分组时

数据存储在SQL server中,如下所示-

seq  person  date                 type
---  ------  -------------------  ----
1    1       2018-02-10 08:00:00  1
2    1       2018-02-11 08:00:00  1
3    1       2018-02-12 08:00:00  1
4    1       2018-02-14 16:00:00  1
5    1       2018-02-15 16:00:00  1
6    1       2018-02-16 16:00:00  1
7    1       2018-02-20 08:00:00  2
8    1       2018-02-21 08:00:00  2
9    1       2018-02-22 08:00:00  2
10   1       2018-02-23 08:00:00  1
11   1       2018-02-24 08:00:00  1
12   1       2018-02-25 08:00:00  2
13   2       2018-02-10 08:00:00  1
14   2       2018-02-11 08:00:00  1
15   2       2018-02-12 08:00:00  1
16   2       2018-02-14 16:00:00  3
17   2       2018-02-15 16:00:00  3
18   2       2018-02-16 16:00:00  3
该数据集包含约120万条与上述类似的记录

我想从中得到的结果是-

person  start                type
------  -------------------  ----
1       2018-02-10 08:00:00  1
1       2018-02-20 08:00:00  2
1       2018-02-23 08:00:00  1
1       2018-02-25 08:00:00  2
2       2018-02-10 08:00:00  1
2       2018-02-14 16:00:00  3
我通过运行以下查询获得第一种格式的数据-

select 
  ROW_NUMBER() OVER (ORDER BY date) AS seq 
  person, 
  date, 
  type, 
from table
group by person, date, type   

我只是不知道如何使用person和type的其他不同值来保持最小日期。

这是一个空白和孤岛问题,因此,您可以使用
行数()的差异来分组:

select person, min(date) as start, type
from (select *, 
              row_number() over (partition by person order by seq) seq1,
              row_number() over (partition by person, type order by seq) seq2
      from table
     ) t
group by person, type, (seq1 - seq2)
order by person, start;

这是一个间隙和孤岛问题,因此,您可以使用
行数()的差异
&在分组中使用它们:

select person, min(date) as start, type
from (select *, 
              row_number() over (partition by person order by seq) seq1,
              row_number() over (partition by person, type order by seq) seq2
      from table
     ) t
group by person, type, (seq1 - seq2)
order by person, start;

使用行号差的正确解决方案是:

select person, type, min(date) as start
from (select t.*, 
             row_number() over (partition by person order by seq) as seqnum_p,
             row_number() over (partition by person, type order by seq) as seqnum_pt
      from t
     ) t
group by person, type, (seqnum_p - seqnum_pt)
order by person, start;

类型
需要包括在
组中

使用行号差异的正确解决方案是:

select person, type, min(date) as start
from (select t.*, 
             row_number() over (partition by person order by seq) as seqnum_p,
             row_number() over (partition by person, type order by seq) as seqnum_pt
      from t
     ) t
group by person, type, (seqnum_p - seqnum_pt)
order by person, start;

类型
需要包含在
分组中,方法是

标记您正在使用的DBMS(即
MySQL
SQL Server
,等等)。我已添加了标记SQL Server。感谢您的推荐。标记您正在使用的DBMS(即
MySQL
SQL Server
,等等)。我已添加了标记SQL Server。谢谢你的推荐。我在这个查询中看到了一些奇怪的事情。在一个示例中:2018-12-30 06:30:00的类型为6,但结果显示该类型为1。我还看到,当时间不同时,会创建一个不同的记录,因此这些记录会彼此跟随-1373 2009-02-24 08:00:00 1 1373 2009-03-10 18:00:001@stats. . . 可能在
GROUPBY
子句中也需要
type
。在一个示例中:2018-12-30 06:30:00的类型为6,但结果显示该类型为1。我还看到,当时间不同时,会创建一个不同的记录,因此这些记录会彼此跟随-1373 2009-02-24 08:00:00 1 1373 2009-03-10 18:00:001@stats. . . 可能需要
type
也在
groupby
子句中。