如何对连续范围进行分组

Luk*_*uke 24 sql t-sql sql-server sql-server-2005 gaps-and-islands

我知道一些基本的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 
Run Code Online (Sandbox Code Playgroud)

我需要这样的观点

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
Run Code Online (Sandbox Code Playgroud)

不幸的是,应用层需要基表格格式为show.这可以在查询中做到吗?

谢谢

卢克

Qua*_*noi 29

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
Run Code Online (Sandbox Code Playgroud)

您可能会对本文感兴趣:


And*_*y M 13

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;
Run Code Online (Sandbox Code Playgroud)

基本上,与Quassnoi的解决方案相同,但ROW_NUMBER少用一个产生更好的执行计划.