Как мне группировать по непрерывным диапазонам - PullRequest
21 голосов
/ 14 апреля 2011

Я знаю некоторые базовые 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

К сожалению, базовая таблица необходима для того, чтобы прикладной уровень находился в формате show.Можно ли это сделать в запросе?

Спасибо

Люк

Ответы [ 5 ]

27 голосов
/ 14 апреля 2011
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

Эта статья может представлять интерес для вас:

12 голосов
/ 14 апреля 2011
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 меньше дает лучший план выполнения.

0 голосов
/ 14 апреля 2011
Select Min(Date) DateFrom, Max(Date) DateTo, Crew Name,DayType From Mytable Group By Crew,DayType 

попробуйте это.

0 голосов
/ 14 апреля 2011
SELECT MIN(Date) AS DateFrom,MAX(Date) AS DateTo, Crew, DayType FROM yourTableName GROUP BY Crew, DayType
0 голосов
/ 14 апреля 2011

что-то вроде:

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