2015-05-30 3 views
0

PFB скриптаНужна помощь, чтобы найти дату начала и дату окончания группы

CREATE TABLE LagLead 
(
    ID INT 
    ,Flag TINYINT 
    ,DateCreated DATETIME 
) 

GO 

INSERT INTO LagLead 
SELECT 100,0,'May 30 2000 11:37AM' 
UNION ALL 
SELECT 100,0,'May 30 2001 11:37AM' 
UNION ALL 
SELECT 100,0,'May 30 2002 11:37AM' 
UNION ALL 
SELECT 100,1,'May 30 2003 11:37AM' 
UNION ALL 
SELECT 100,1,'May 30 2004 11:37AM' 
UNION ALL 
SELECT 100,1,'May 30 2005 11:37AM' 
UNION ALL 
SELECT 100,0,'May 30 2006 11:37AM' 
UNION ALL 
SELECT 100,0,'May 30 2007 11:37AM' 
UNION ALL 
SELECT 100,0,'May 30 2008 11:37AM' 
UNION ALL 
SELECT 101,1,'May 30 2004 11:37AM' 
UNION ALL 
SELECT 101,1,'May 30 2005 11:37AM' 
UNION ALL 
SELECT 102,0,'May 30 2004 11:37AM' 

Источник Таблица записей:

enter image description here

Мне нужно вывести что-то вроде выхода ниже запроса, но нужно избавиться от жесткого кода 2 и 9, который присутствует внутри скрипта. Благодаря

Ожидаемый результат:

enter image description here

Я попытался с помощью этого сценария, но нужно сделать это динамический (удалить жесткий код 2,9)

SELECT ID,Flag,Lag AS StartDate,Lead AS EndDate FROM 
(
SELECT * 
,CASE WHEN Flag != LEAD(Flag,1,9) OVER (PARTITION BY ID ORDER BY DateCreated) THEN 1 ELSE 0 END AS LeadFlag 
,LAG(DateCreated,2,DateCreated) OVER (PARTITION BY ID ORDER BY DateCreated) AS Lag 
,LEAD(DateCreated,1,DateCreated) OVER (PARTITION BY ID ORDER BY DateCreated) AS Lead 
    FROM LagLead 
)src 
WHERE LeadFlag = 1 

It'a не обязательно использовать функцию Lag/lead.

+1

Опишите свою проблему и ожидаемые результаты, а не просто дайте сценарий. –

ответ

1

Я сделал это без лаг и свинца.

with cte as (
    select row_number() over (order by id, DateCreated) as r, 
     row_number() over (partition by id, flag order by id, DateCreated) as pr 
     , * 
    from LagLead 
), grouped as (
    select *, r - pr as g 
    from cte 
) 

select id, flag, min(DateCreated), max(DateCreated) 
from grouped 
group by id, flag, g 
order by id, min(DateCreated) 

Вы можете наверняка уйти с этим в один цит, но я нахожу этот стиль более наглядным. В качестве пояснения я создаю два «виртуальных» столбца - один, который перечисляет весь набор, и тот, который перечисляет строки в наборе строк, которые имеют одинаковое значение id и flag (оба упорядочены одним и тем же набором столбцов). Главное наблюдение заключается в том, что до тех пор, пока значение флага не изменяется от строки к строке, оба этих столбца будут увеличиваться на 1, и поэтому разница между ними будет одинаковой между строками. Однако, как только комбинация (id, flag) изменяется, первый row_number и второй row_number будут увеличиваться на другое значение, и, таким образом, разница между ними будет, отличная от предыдущей. Это дает нам удобное значение для группировки. Кстати, этот тип проблемы обычно называют «пробелами и островами».

+0

Спасибо за сценарий и приятное объяснение, но мой результат немного отличается от вывода вашего скрипта. – aks

+0

Большое спасибо, я могу получить ожидаемый результат, используя ваш скрипт. – aks