私はこのようになりますテーブルがあります。表示する日付範囲 - ギャップと諸島
+------------+------+
| Date | Name |
+------------+------+
| 2017-01-07 | A |
| 2017-01-08 | A |
| 2017-01-09 | A |
| 2017-01-12 | A |
| 2017-01-07 | B |
| 2017-01-08 | B |
| 2017-01-09 | B |
+------------+------+
を私は次のようにそれを回すことができるようにしたいと思います:
+-------------------------+------+
| Date Range | Name |
+-------------------------+------+
| 2017-01-07 - 2017-01-09 | A |
| 2017-01-07 - 2017-01-09 | B |
| 2017-01-12 | A |
+-------------------------+------+
コード連続した日付の最小値と最大値を見つけるには、名前列を使用して結果をグループ化し、最小値と最大値を1つの列に 'to and from'文字列としてリストします。
連続した日付のみを表示する際に問題が発生しています。上記の3番目のエントリは、それ以前のエントリの 'A'の日付範囲と連続していないため、独自のエントリを取得することに注意してください。
編集注:これは、LAG機能の使用を許可していないSQL Server 2008に固有です。
EDIT 2:McNetsから供給されたオリジナルの答えは、SQL Server 2012上でうまく働いた は、SQL Server 2012年以降を持っている場合、それは良いでしょう、私はそれをここに含めました。
;WITH CalcDiffDays AS
(
SELECT Date, Name,
CONCAT (Name, CAST(DATEDIFF(DAY, LAG(Date, 1, Date - 1) OVER (PARTITION BY Name ORDER BY Name, Date), Date) AS VARCHAR(10))) AS NumDays
FROM @tmpTable
)
SELECT CONCAT(CONVERT(VARCHAR(20), MIN(Date), 102), ' - ', CONVERT(VARCHAR(20), MAX(Date), 102)) AS [Data Range], Name
FROM CalcDiffDays
GROUP BY NumDays, Name;
の可能性のある重複した[列のSQLトランスポーズ行を集約せずに](http://stackoverflow.com/questions/41462218/sql-transpose-rows-to-columns -without-aggregate) – iamdave