2014-06-14 3 views
-2
 
ID  Dateandtime EmailID 
93 6/1/2014 00:00:00 4 
94 6/2/2014 00:00:00 4 
95 6/3/2014 00:00:00 2 
96 6/4/2014 00:00:00 2 
97 6/5/2014 00:00:00 2 
98 6/6/2014 00:00:00 2 
99 6/7/2014 00:00:00 2 
73 6/8/2014 00:00:00 2 
74 6/9/2014 00:00:00 2 
75 6/10/2014 00:00:00 4 
76 6/11/2014 00:00:00 4 
77 6/12/2014 00:00:00 2 
78 6/13/2014 00:00:00 2 
79 6/14/2014 00:00:00 2 
80 6/16/2014 00:00:00 2 
81 6/17/2014 00:00:00 4 
82 6/18/2014 00:00:00 4 
83 6/19/2014 00:00:00 4 
84 6/20/2014 00:00:00 4 
100 6/21/2014 00:00:00 4 
101 6/22/2014 00:00:00 4 
102 6/23/2014 00:00:00 4 
103 6/24/2014 00:00:00 4 
89 6/27/2014 00:00:00 4 
90 6/28/2014 00:00:00 4 
91 6/29/2014 00:00:00 4 
92 6/30/2014 00:00:00 4 
104 7/1/2014 00:00:00 4 
105 7/2/2014 00:00:00 4 
106 7/3/2014 00:00:00 4 
121 7/6/2014 00:00:00 2 
122 7/7/2014 00:00:00 2 
123 7/8/2014 00:00:00 2 

생성 여기에 출력는 SQL 날짜 그룹화 및 데이터베이스

 
Startdate    EndDate   EmailID 
6/3/2014 00:00:00 6/14/2014 00:00:00 2 
6/16/2014 00:00:00 6/16/2014 00:00:00 2 
7/6/2014 00:00:00 7/8/2014 00:00:00 2 
6/1/2014 00:00:00 6/11/2014 00:00:00 4 
6/17/2014 00:00:00 6/24/2014 00:00:00 4 
6/27/2014 00:00:00 7/3/2014 00:00:00 4 

생성 된 출력 한 comon 필드 아니 내가 아니라 (2014년 6월 3일 6과 같이 종료 날짜에 startDate를 원하기 때문에 완벽한/9/2014 및 EmailId = 2) 및 (6/10/2014 ~ 6/11/11, EmailId = 4) 및 (2014 년 6 월 12 일 ~ 2014 년 6 월 14 일 및 EmailId = 2) 데이터베이스가 그룹에 추가되지 않음

+2

나는이 질문은 다른 방법으로 혼란 스러워요 http://stackoverflow.com/questions/24217339/sql-date-grouping-with-avaliable-dates-in-database 왜 대답이 당신의 문제를 해결하지 못합니다. –

답변

0

설명하기 다소 복잡한 쿼리이지만 여기에 시도가 있습니다.

시간이 항상 자정 인 경우 공통 테이블 식을 사용하여 각 행에 행 번호를 할당하고 날짜와 행 번호의 차이로 그룹화 할 수 있습니다. 순서가 깨지지 않는 한 (즉, 날짜가 연속적이며 동일한 전자 메일 ID로) 동일한 그룹에서 끝나고 외부 쿼리는 각 그룹의 시작 날짜와 종료 날짜를 쉽게 추출 할 수 있습니다.

WITH cte AS (
SELECT dateandtime, emailid, 
    ROW_NUMBER() OVER (PARTITION BY emailid ORDER BY dateandtime) rn 
FROM mytable 
) 
SELECT MIN(dateandtime) start_time, 
     MAX(dateandtime) end_time, 
     MAX(emailid) emailid 
FROM cte GROUP BY DATEADD(d, -rn, dateandtime) ORDER BY start_time 

An SQLfiddle to test with.

datetimes가 항상 자정이 아닌 경우 그룹화가 실패합니다. 이 경우이 쿼리를 실행하기 전에 datetime을 날짜로 변환하는 공통 테이블 식을 별도의 단계로 추가 할 수 있습니다.

0

이메일 ID가 동일한 블록으로 연속 날짜를 찾고 있습니다. 이것은 날짜에 간격이 없다고 가정합니다. 가장 우아한 접근 방법인지는 잘 모르겠지만이 주제에 대해 많은 것을 찾을 수 있습니다.

with BlockStart as (
    select t.StartDate, t.EmailID 
    from T as t left outer join T as t2 
     on t2.StartDate = t1.StartDate - 1 and t2.EmailID = t1.EmailID 
    where t2.StartDate is null 
    union all 
    select max(StartDate) + 1, null 
    from T 
) as BlockStart 
select 
    StartDate, 
    (select min(StartDate) - 1 from BlockStart as bs2 where bs2 > bs.StartDate) as EndDate, 
    EmailID 
from BlockStart as bs 
where 
    EmailID is not null 
    -- /* or */ exists (select 1 from BlockStart as bs3 where bs3.StartDate > bs.StartDate)