Как я группируюсь на непрерывных диапазонах
Я знаю некоторый базовый 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
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
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
SELECT MIN(Date) AS DateFrom,MAX(Date) AS DateTo, Crew, DayType FROM yourTableName GROUP BY Crew, DayType
Ответ 4
Что-то вроде:
SELECT Crew, DayType, MIN(Date) AS SomeDate1, MAX(Date) AS SomeDate2
FROM Mytable
GROUP BY Crew, DayType
Ответ 5
Select Min(Date) DateFrom, Max(Date) DateTo, Crew Name,DayType From Mytable Group By Crew,DayType
попробуйте это.