我有表,看起來像這樣:顯示日期範圍 - 差距和羣島
+------------+------+
| 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 |
+-------------------------+------+
代碼將僅查找連續日期的最小值和最大值,使用名稱列對結果進行分組,然後將最小和最大日期列爲一列中的「從和到」字符串。
我在嘗試僅列出連續日期時遇到問題。請注意,上面的第三個條目獲取它自己的條目,因爲它與先前條目中的「A」的日期範圍不連續。
編輯:請注意:這是特定於SQL Server 2008,它不允許使用LAG功能。
編輯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