2017-04-12 49 views
0

我正在尝试总结一个数据集并获取每个组的最小和最大日期。但是,如果存在差距,则组可以存在多次。下面是样本数据:具有多个Group BY列的SQL Server Group行

CREATE TABLE temp (
id int, 
FIRSTNAME nvarchar(50), 
LASTNAME nvarchar(50), 
STARTDATE datetime2(7), 
ENDDATE datetime2(7) 
) 

INSERT into temp values(1,'JOHN','SMITH','2013-04-02','2013-05-31') 
INSERT into temp values(2,'JOHN','SMITH','2013-05-31','2013-10-31') 
INSERT into temp values(3,'JANE','DOE','2013-10-31','2016-07-19') 
INSERT into temp values(4,'JANE','DOE','2016-07-19','2016-08-11') 
INSERT into temp values(5,'JOHN','SMITH','2016-08-11','2017-02-01') 
INSERT into temp values(6,'JOHN','SMITH','2017-02-01','9999-12-31') 

我期待汇总数据如下:

JOHN SMITH 2013-04-02 2013-10-31 
JANE DOE  2013-10-31 2016-08-11 
JOHN SMITH 2016-08-11 9999-12-31 

一个“GROUP BY”,将二者结合起来约翰·史密斯与不正确的最小和最大日期一​​起记录。

任何帮助表示赞赏。

谢谢。

+0

这是[间隙和岛屿]问题(https://www.simple-talk.com/sql/t-sql-programming/the-sql-of-gaps-and-islands-in-sequences/)问题。他们不是很容易解决,但它是完全可行的。 – JNevill

回答

0

正如JNevill指出的那样,这是一个典型的差距和岛屿问题。以下是使用Row_Number()的一种解决方案。

Select FirstName 
     ,LastName 
     ,StartDate=min(StartDate) 
     ,EndDate =max(EndDate) 
From (
     Select * 
       ,Grp = Row_Number() over (Order by ID) - Row_Number() over (Partition By FirstName,LastName Order by EndDate) 
     From Temp 
    ) A 
Group By FirstName,LastName,Grp 
Order By min(StartDate) 
+0

非常感谢。搜索时,我甚至不知道如何分类。现在我知道,差距和岛屿。 – user4956435

+0

@ user4956435对它有帮助 –

0

请尝试以下...

SELECT firstName, 
     lastName, 
     MIN(startDate) AS earliestStartDate, 
     MAX(endDate) AS latestEndDate 
FROM temp 
GROUP BY firstName, 
     lastName; 

本声明将使用GROUP BY语句组一起根据firstNamelastName组合的记录。然后,它将返回各组的firstNamelastName以及该组的最早的startDate,该组的功能为MIN()功能,最后的组为MAX()功能。

如果您有任何问题或意见,请随时发布相应评论。