具有多个Group BY列的SQL Server组行

时间:2017-04-12 21:08:41

标签: sql-server

我正在尝试汇总数据集并获取每个组的最小和最大日期。但是,如果存在差距,则可以多次存在一个组。以下是示例数据:

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”将两个John Smith记录与错误的最小和最大日期组合在一起。

感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:0)

正如JNevill指出的那样,这是一个经典的Gaps and Islands问题。以下是使用 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)

答案 1 :(得分:0)

请尝试以下方法......

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

此语句将使用GROUP BY语句根据firstNamelastName组合将记录组合​​在一起。然后,它会返回每个组的firstNamelastName以及startDate函数和最新MIN()的最早endDate。该群体由MAX()函数提供。

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