sql 将日期行重复到新的列中 table

sql repeated date rows to columns on a new table

我正在寻找类似于枢轴函数的东西 我有一个 table 显示用户的日期范围,告诉我用户在一段时间内不在。

编号 |用户名 |开始时间 |结束时间 |申请日期
---| ----------| -------------- | -------------- | ------------------
1 | 63 | 08:00 | 10:00 | 01-01-2017
2 | 63 | 10:00 | 10:40 | 01-01-2017
3 | 63 | 11:00 | 12:00 | 2017 年 3 月 1 日
4 | 63 | 14:30 | 15:30 | 2017 年 4 月 1 日
5 | 63 | 13:00 | 13:30 | 2017 年 3 月 1 日

我知道我每天只能有 2 个权限,我需要将具有相同日期的那些分组到一个新的 table。

数据应如下所示

用户 ID | ID1 |开始时间 1 |结束时间 1 | ID2 |开始时间2 |结束时间 2 | 申请日期
---------- | ------ | ---------- | ------ | --- | ---------- | -------- |------------
63 | 1 | 08:00 | 10:00 | 2 | 10:00 | 10:40 | 01-01-2017
63 | 3 | 11:00 | 12:00 | 5 | 13:00 | 13:30 | 2017 年 3 月 1 日
63 | 4 |14:30 | 15:30 |空 |空 |空 |04-01-2017

因为您知道您每天最多要对每个用户 2 条记录进行分组,所以您可以简单地使用 CTE 和左连接:

;WITH p AS (
  SELECT Id, UserId, BeginingTime, EndTime, DateApplied, 
         ROW_NUMBER() OVER (PARTITION BY UserId, DateApplied ORDER BY BeginingTime) AS RowNo
  FROM SourceTable
)
SELECT p1.UserId, p1.Id as ID1, 
       p1.BeginingTime AS BeginingTime1, p1.EndTime AS EndTime1,
       p2.Id as ID2, 
       p2.BeginingTime AS BeginingTime2, p2.EndTime AS EndTime2,
       p1.DateApplied
FROM p p1 LEFT JOIN p p2 
          ON p1.UserId = p2.UserId AND p1.DateApplied = p2.DateApplied AND p2.RowNo = 2
WHERE p1.RowNo = 1