SQL折叠数据
我正在尝试折叠按日期排序的序列中的数据。在根据人员和类型分组时 数据存储在SQL server中,如下所示-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
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
子句中。