복붙노트

[SQL] 어떻게 연속 범위에 나 나 그룹을

SQL

어떻게 연속 범위에 나 나 그룹을

나는 몇 가지 기본적인 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

불행하게도 기본 테이블 형식의 쇼에있을 응용 프로그램 계층이 필요합니다. 이 쿼리에서 할 수 있습니까?

감사

누가 복음

해결법

  1. ==============================

    1.

    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
    

    이 문서가 관심을 가질 수 있습니다 :

  2. ==============================

    2.

    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 적은 수확량에게 더 나은 실행 계획을 사용하는 것과 동일합니다.

  3. ==============================

    3.

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

    4.뭔가 같이 :

    뭔가 같이 :

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

    5.

    Select Min(Date) DateFrom, Max(Date) DateTo, Crew Name,DayType From Mytable Group By Crew,DayType 
    

    이 시도.

  6. from https://stackoverflow.com/questions/5662545/how-do-i-group-on-continuous-ranges by cc-by-sa and MIT license