我正在尝试汇总数据集并获取每个组的最小和最大日期。但是,如果存在差距,则可以多次存在一个组。以下是示例数据:
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记录与错误的最小和最大日期组合在一起。
感谢任何帮助。
感谢。
答案 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
语句根据firstName
和lastName
组合将记录组合在一起。然后,它会返回每个组的firstName
和lastName
以及startDate
函数和最新MIN()
的最早endDate
。该群体由MAX()
函数提供。
如果您有任何问题或意见,请随时发表评论。