sql - 합치기 - 파워포인트 그룹화 안됨




연속 범위로 그룹화하는 방법 (4)

뭔가가 좋아.

SELECT Crew, DayType, MIN(Date) AS SomeDate1, MAX(Date) AS SomeDate2 
FROM Mytable 
GROUP BY Crew, DayType

내가 몇 가지 기본적인 SQL을 알고 있지만,이 하나는 나를 넘어있다. 나는 높고 낮게 보이지만 주사위는 보지 않았습니다. 다음 데이터 뷰가 필요합니다. 응용 프로그램 계층 코드에서이 작업을 수행 할 수 있습니다. 그러나 불행하게도이 특정 코드의 경우 코드를 데이터 영역에 넣어야합니다.

나는 T-SQL을 사용하고있다.

Date      Crew       DayType
01-02-11  John Doe  SEA  
02-02-11  John Doe  SEA  
03-02-11  John Doe  SEA  
04-02-11  John Doe  HOME  
05-02-11  John Doe  HOME  
06-02-11  John Doe  SEA 

이 같은 견해가 필요해.

DateFrom  DateTo    Name      DayType
01-02-11  03-02-11  John Doe  SEA
04-02-11  05-02-11  John Doe  HOME
06-02-11  06-02-11  John Doe  SEA

불행히도 응용 프로그램 계층이 쇼 형식이어야 기본 테이블이 필요합니다. 이 질문에 할 수 있습니까?

감사

루크


SELECT MIN(Date) AS DateFrom,MAX(Date) AS DateTo, Crew, DayType FROM yourTableName GROUP BY Crew, DayType

WITH    q AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY crew, dayType ORDER BY [date]) AS rnd,
                ROW_NUMBER() OVER (PARTITION BY crew ORDER BY [date]) AS rn
        FROM    mytable
        )
SELECT  MIN([date]), MAX([date]), crew AS name, dayType
FROM    q
GROUP BY
        crew, dayType, rnd - rn

이 기사는 당신에게 흥미로울 수 있습니다 :


WITH grouped AS (
  SELECT
    *,
    grp = DATEDIFF(day, 0, Date) -
          ROW_NUMBER() OVER (PARTITION BY Crew, DayType ORDER BY Date)
  FROM @testtable
)
SELECT
  DateFrom = MIN(Date),
  DateTo = MAX(Date),
  Name = Crew,
  DayType
FROM grouped
GROUP BY Crew, DayType, grp;

기본적으로 Quassnoi의 솔루션과 동일하지만 ROW_NUMBER 적게 사용하면 더 나은 실행 계획을 얻을 수 있습니다.





gaps-and-islands