Bar*_*art 6 sql t-sql sql-server gaps-and-islands
我有包含以下列的表格:
[name_of_pos] varchar,
[date_from] datetime,
[date_to] datetime
Run Code Online (Sandbox Code Playgroud)
以下是我的样本数据:
name_of_pos date_from date_to
----------------------------------------------------------------
Asystent 2015-08-26 08:57:49.000 2015-09-04 08:57:49.000
Biuro 2015-09-01 08:53:32.000 2015-09-01 08:53:32.000
Biuro 2015-09-02 09:00:41.000 2015-09-02 09:00:41.000
Biuro 2015-09-03 11:46:03.000 2015-09-03 11:46:03.000
Biuro 2015-09-10 09:02:11.000 2015-09-15 09:02:11.000
Koordynator 2015-09-01 09:04:06.000 2015-09-01 09:04:06.000
Projektant 2015-08-31 08:59:46.000 2015-09-01 08:59:46.000
Projektant 2015-09-02 08:00:54.000 2015-09-02 08:00:54.000
Projektant 2015-09-14 12:34:50.000 2015-09-14 12:34:50.000
Run Code Online (Sandbox Code Playgroud)
我想要返回的是每个的日期范围(最小值date_from到最大值) ,但仅限于日期值连续的情况(时间部分并不重要,可以在结果中忽略)。date_toname_of_pos
期望的输出是:
name_of_pos date_from date_to
------------------------------------
Asystent 2015-08-26 2015-09-04
Biuro 2015-09-01 2015-09-03
Biuro 2015-09-10 2015-09-15
Koordynator 2015-09-01 2015-09-01
Projektant 2015-08-31 2015-09-02
Projektant 2015-09-14 2015-09-14
Run Code Online (Sandbox Code Playgroud)
我尝试使用类似于此问题的解决方案:
但没有运气,因为我有两个日期时间列。
这是一个使用 acte迭代行(在排序后)并在分组之前检查连续天数的解决方案:
-- dummy table
CREATE TABLE #TableA
(
[name_of_pos] VARCHAR(11) ,
[date_from] DATETIME ,
[date_to] DATETIME
);
-- insert dummy data
INSERT INTO #TableA
( [name_of_pos], [date_from], [date_to] )
VALUES ( 'Asystent', '2015-08-26 08:57:49', '2015-09-04 08:57:49' ),
( 'Biuro', '2015-09-01 08:53:32', '2015-09-01 08:53:32' ),
( 'Biuro', '2015-09-02 09:00:41', '2015-09-02 09:00:41' ),
( 'Biuro', '2015-09-03 11:46:03', '2015-09-03 11:46:03' ),
( 'Biuro', '2015-09-10 09:02:11', '2015-09-15 09:02:11' ),
( 'Koordynator', '2015-09-01 09:04:06', '2015-09-01 09:04:06' ),
( 'Projektant', '2015-08-31 08:59:46', '2015-09-01 08:59:46' ),
( 'Projektant', '2015-09-02 08:00:54', '2015-09-02 08:00:54' ),
( 'Projektant', '2015-09-14 12:34:50', '2015-09-14 12:34:50' );
-- new temp table used to add row numbers for data order
SELECT name_of_pos, CAST(date_from AS DATE) date_from, CAST(date_to AS DATE) date_to,
ROW_NUMBER() OVER ( ORDER BY name_of_pos, date_from ) rn
INTO #temp
FROM #TableA
-- GroupingColumn in cte used to identify and group consecutive dates
;WITH cte
AS ( SELECT name_of_pos ,
date_from ,
date_to ,
1 AS GroupingColumn ,
rn
FROM #temp
WHERE rn = 1
UNION ALL
SELECT t2.name_of_pos ,
t2.date_from ,
t2.date_to ,
CASE WHEN t2.date_from = DATEADD(day, 1, cte.date_to)
AND cte.name_of_pos = t2.name_of_pos
THEN cte.GroupingColumn
ELSE cte.GroupingColumn + 1
END AS GroupingColumn ,
t2.rn
FROM #temp t2
INNER JOIN cte ON t2.rn = cte.rn + 1
)
SELECT name_of_pos, MIN(date_from) AS date_from, MAX(date_to) AS date_to
FROM cte
GROUP BY name_of_pos, GroupingColumn
DROP TABLE #temp
DROP TABLE #TableA
Run Code Online (Sandbox Code Playgroud)
产生您想要的输出:
name_of_pos date_from date_to
Asystent 2015-08-26 2015-09-04
Biuro 2015-09-01 2015-09-03
Biuro 2015-09-10 2015-09-15
Koordynator 2015-09-01 2015-09-01
Projektant 2015-08-31 2015-09-02
Projektant 2015-09-14 2015-09-14
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4116 次 |
| 最近记录: |