29

私はいくつかの基本的な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

残念ながら、アプリケーション層を表示された形式にするためには、ベーステーブルが必要です。これはクエリで実行できますか?

4

5 に答える 5

34
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

この記事はあなたに興味があるかもしれません:

于 2011-04-14T11:36:06.380 に答える
15
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のソリューションと同じですが、使用する回数が1つROW_NUMBER少ないほど、実行プランが向上します。

于 2011-04-14T13:46:30.530 に答える
0
SELECT MIN(Date) AS DateFrom,MAX(Date) AS DateTo, Crew, DayType FROM yourTableName GROUP BY Crew, DayType
于 2011-04-14T11:35:40.500 に答える
-1

何かのようなもの:

SELECT Crew, DayType, MIN(Date) AS SomeDate1, MAX(Date) AS SomeDate2 
FROM Mytable 
GROUP BY Crew, DayType
于 2011-04-14T11:34:03.930 に答える
-2
Select Min(Date) DateFrom, Max(Date) DateTo, Crew Name,DayType From Mytable Group By Crew,DayType 

これを試して。

于 2011-04-14T11:40:31.580 に答える