Sql server 将生成的列添加到SQL查询结果的末尾
我试图弄清楚是否可以使用SQL生成一个人工列 鉴于下面的假数据,您如何创建一个名为Sql server 将生成的列添加到SQL查询结果的末尾,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我试图弄清楚是否可以使用SQL生成一个人工列 鉴于下面的假数据,您如何创建一个名为generated\u SEQUENCE的生成列 规则如下: 必须在同一课程中(Id) 必须在同一日期(课程日期) 每个课程的时间间隔必须在30分钟以内(课程开始时间和课程结束时间) 代码: 这可能吗 谢谢 这里有一个选项 子查询使用: 课程结束日期的延迟(),因此我们可以在DATEDIFF()中使用该延迟来确定上一课程完成的分钟数 通过一个案例陈述来评估这一点,以确定我们是否在30分钟内成为一个名为[Pre
generated\u SEQUENCE
的生成列
规则如下:
- 必须在同一课程中(Id)
- 必须在同一日期(课程日期)
- 每个课程的时间间隔必须在30分钟以内(课程开始时间和课程结束时间)
- 课程结束日期的延迟(),因此我们可以在DATEDIFF()中使用该延迟来确定上一课程完成的分钟数
- 通过一个案例陈述来评估这一点,以确定我们是否在30分钟内成为一个名为[PrevCourseWithIn30]的新专栏
DECLARE @TestData TABLE
(
[Id] INT
, [Course_Name] NVARCHAR(100)
, [Course_Date] DATE
, [Course_Start_Time] TIME
, [Course_End_Time] TIME
);
INSERT INTO @TestData (
[Id]
, [Course_Name]
, [Course_Date]
, [Course_Start_Time]
, [Course_End_Time]
)
SELECT 111 AS [Id]
, 'Bio 101' AS [Course_Name]
, '2016-01-10' AS [Course_Date]
, '09:00:00' AS [Course_Start_Time]
, '09:45:00' AS [Course_End_Time]
UNION ALL
SELECT 111 AS [Id]
, 'Bio 101' AS [Course_Name]
, '2016-01-10' AS [Course_Date]
, '10:00:00' AS [Course_Start_Time]
, '10:45:00' AS [Course_End_Time]
UNION ALL
SELECT 111 AS [Id]
, 'Bio 101' AS [Course_Name]
, '2016-01-10' AS [Course_Date]
, '11:05:00' AS [Course_Start_Time]
, '12:30:00' AS [Course_End_Time]
UNION ALL
SELECT 431 AS [Id]
, 'Econ 101' AS [Course_Name]
, '2016-01-12' AS [Course_Date]
, '11:00:00' AS [Course_Start_Time]
, '12:45:00' AS [Course_End_Time]
UNION ALL
SELECT 111 AS [Id]
, 'Bio 101' AS [Course_Name]
, '2016-01-12' AS [Course_Date]
, '1:00:00' AS [Course_Start_Time]
, '2:45:00' AS [Course_End_Time]
UNION ALL
SELECT 543 AS [Id]
, 'Eng 200' AS [Course_Name]
, '2016-01-13' AS [Course_Date]
, '2:00:00' AS [Course_Start_Time]
, '2:45:00' AS [Course_End_Time]
UNION ALL
SELECT 543 AS [Id]
, 'Eng 200' AS [Course_Name]
, '2016-01-13' AS [Course_Date]
, '2:55:00' AS [Course_Start_Time]
, '3:55:00' AS [Course_End_Time]
UNION ALL
SELECT 543 AS [Id]
, 'Eng 200' AS [Course_Name]
, '2016-01-14' AS [Course_Date]
, '6:00:00' AS [Course_Start_Time]
, '8:15:00' AS [Course_End_Time];
SELECT *
, ROW_NUMBER() OVER ( PARTITION BY [CS].[Id]
, [CS].[Course_Date]
, [CS].[PrevCourseWithIn30]
ORDER BY [CS].[Course_Start_Time]
) AS [GENERATED_SEQUENCE]
FROM (
SELECT *
, CASE WHEN DATEDIFF(
MINUTE
, LAG(
[Course_End_Time]
, 1
, [Course_Start_Time]
) OVER ( PARTITION BY [Id]
, [Course_Date]
ORDER BY [Course_Start_Time]
)
, [Course_Start_Time]
) <= 30 THEN 1
ELSE 0
END AS [PrevCourseWithIn30]
FROM @TestData
) AS [CS];
DECLARE@TestData表
(
[Id]INT
,[课程名称]NVARCHAR(100)
,[课程日期]日期
,[课程开始时间]时间
,[课程结束时间]时间
);
插入到@TestData中(
[Id]
,[课程名称]
,[课程日期]
,[课程开始时间]
,[课程结束时间]
)
选择111作为[Id]
“生物101”作为[课程名称]
,“2016-01-10”作为[课程日期]
,'09:00:00'作为[课程开始时间]
,'09:45:00'作为[课程结束时间]
联合所有
选择111作为[Id]
“生物101”作为[课程名称]
,“2016-01-10”作为[课程日期]
,“10:00:00”作为[课程开始时间]
,“10:45:00”作为[课程结束时间]
联合所有
选择111作为[Id]
“生物101”作为[课程名称]
,“2016-01-10”作为[课程日期]
,'11:05:00'作为[课程开始时间]
,“12:30:00”作为[课程结束时间]
联合所有
选择431作为[Id]
“经济101”作为[课程名称]
,“2016-01-12”作为[课程日期]
,“11:00:00”作为[课程开始时间]
,“12:45:00”作为[课程结束时间]
联合所有
选择111作为[Id]
“生物101”作为[课程名称]
,“2016-01-12”作为[课程日期]
,“1:00:00”作为[课程开始时间]
,“2:45:00”作为[课程结束时间]
联合所有
选择543作为[Id]
“英语200”作为[课程名称]
,“2016-01-13”作为[课程日期]
,“2:00:00”作为[课程开始时间]
,“2:45:00”作为[课程结束时间]
联合所有
选择543作为[Id]
“英语200”作为[课程名称]
,“2016-01-13”作为[课程日期]
,“2:55:00”作为[课程开始时间]
,“3:55:00”作为[课程结束时间]
联合所有
选择543作为[Id]
“英语200”作为[课程名称]
,“2016-01-14”作为[课程日期]
,“6:00:00”作为[课程开始时间]
,“8:15:00”作为[课程结束时间];
挑选*
,按[CS].[Id]划分的(上)行的编号()
,[CS].[课程日期]
,[CS].[PrevCourseWithIn30]
由[CS]订购。[课程开始时间]
)AS[生成的_序列]
从(
挑选*
,DATEDIFF时的大小写(
分钟
,滞后(
[课程结束时间]
1.
,[课程开始时间]
)超过(按[Id]分区)
,[课程日期]
订购人[课程开始时间]
)
,[课程开始时间]
)这里有一个选项
子查询使用:
- 课程结束日期的延迟(),因此我们可以在DATEDIFF()中使用该延迟来确定上一课程完成的分钟数
- 通过一个案例陈述来评估这一点,以确定我们是否在30分钟内成为一个名为[PrevCourseWithIn30]的新专栏
然后,您只需使用ROW_NUMBER()窗口函数,按Id、课程日期和新的[PrevCourseWithIn30]列进行分区,即可获得新的[GENERATED_SEQUENCE]列
看看这个:
DECLARE @TestData TABLE
(
[Id] INT
, [Course_Name] NVARCHAR(100)
, [Course_Date] DATE
, [Course_Start_Time] TIME
, [Course_End_Time] TIME
);
INSERT INTO @TestData (
[Id]
, [Course_Name]
, [Course_Date]
, [Course_Start_Time]
, [Course_End_Time]
)
SELECT 111 AS [Id]
, 'Bio 101' AS [Course_Name]
, '2016-01-10' AS [Course_Date]
, '09:00:00' AS [Course_Start_Time]
, '09:45:00' AS [Course_End_Time]
UNION ALL
SELECT 111 AS [Id]
, 'Bio 101' AS [Course_Name]
, '2016-01-10' AS [Course_Date]
, '10:00:00' AS [Course_Start_Time]
, '10:45:00' AS [Course_End_Time]
UNION ALL
SELECT 111 AS [Id]
, 'Bio 101' AS [Course_Name]
, '2016-01-10' AS [Course_Date]
, '11:05:00' AS [Course_Start_Time]
, '12:30:00' AS [Course_End_Time]
UNION ALL
SELECT 431 AS [Id]
, 'Econ 101' AS [Course_Name]
, '2016-01-12' AS [Course_Date]
, '11:00:00' AS [Course_Start_Time]
, '12:45:00' AS [Course_End_Time]
UNION ALL
SELECT 111 AS [Id]
, 'Bio 101' AS [Course_Name]
, '2016-01-12' AS [Course_Date]
, '1:00:00' AS [Course_Start_Time]
, '2:45:00' AS [Course_End_Time]
UNION ALL
SELECT 543 AS [Id]
, 'Eng 200' AS [Course_Name]
, '2016-01-13' AS [Course_Date]
, '2:00:00' AS [Course_Start_Time]
, '2:45:00' AS [Course_End_Time]
UNION ALL
SELECT 543 AS [Id]
, 'Eng 200' AS [Course_Name]
, '2016-01-13' AS [Course_Date]
, '2:55:00' AS [Course_Start_Time]
, '3:55:00' AS [Course_End_Time]
UNION ALL
SELECT 543 AS [Id]
, 'Eng 200' AS [Course_Name]
, '2016-01-14' AS [Course_Date]
, '6:00:00' AS [Course_Start_Time]
, '8:15:00' AS [Course_End_Time];
SELECT *
, ROW_NUMBER() OVER ( PARTITION BY [CS].[Id]
, [CS].[Course_Date]
, [CS].[PrevCourseWithIn30]
ORDER BY [CS].[Course_Start_Time]
) AS [GENERATED_SEQUENCE]
FROM (
SELECT *
, CASE WHEN DATEDIFF(
MINUTE
, LAG(
[Course_End_Time]
, 1
, [Course_Start_Time]
) OVER ( PARTITION BY [Id]
, [Course_Date]
ORDER BY [Course_Start_Time]
)
, [Course_Start_Time]
) <= 30 THEN 1
ELSE 0
END AS [PrevCourseWithIn30]
FROM @TestData
) AS [CS];
DECLARE@TestData表
(
[Id]INT
,[课程名称]NVARCHAR(100)
,[课程日期]日期
,[课程开始时间]时间
,[课程结束时间]时间
);
插入到@TestData中(
[Id]
,[课程名称]
,[课程日期]
,[课程开始时间]
,[课程结束时间]
)
选择111作为[Id]
“生物101”作为[课程名称]
,“2016-01-10”作为[课程日期]
,'09:00:00'作为[课程开始时间]
,'09:45:00'作为[课程结束时间]
联合所有
选择111作为[Id]
“生物101”作为[课程名称]
,“2016-01-10”作为[课程日期]
,“10:00:00”作为[课程开始时间]
,“10:45:00”作为[课程结束时间]
WITH cteCourse
AS (SELECT 111 AS Id,
'Bio 101' AS Course_Name,
'1/10/2016' AS Course_Date,
'09:00:00' AS Course_Start_Time,
'09:45:00' AS Course_End_Time
UNION ALL
SELECT 111 AS Id,
'Bio 101' AS Course_Name,
'1/10/2016' AS Course_Date,
'10:00:00' AS Course_Start_Time,
'10:45:00' AS Course_End_Time
UNION ALL
SELECT 111 AS Id,
'Bio 101' AS Course_Name,
'1/10/2016' AS Course_Date,
'11:05:00' AS Course_Start_Time,
'12:30:00' AS Course_End_Time
UNION ALL
SELECT 431 AS Id,
'Econ 101' AS Course_Name,
'1/12/2016' AS Course_Date,
'11:00:00' AS Course_Start_Time,
'12:45:00' AS Course_End_Time
UNION ALL
SELECT 111 AS Id,
'Bio 101' AS Course_Name,
'1/12/2016' AS Course_Date,
'13:00:00' AS Course_Start_Time,
'14:45:00' AS Course_End_Time
UNION ALL
SELECT 543 AS Id,
'Eng 200' AS Course_Name,
'1/13/2016' AS Course_Date,
'14:00:00' AS Course_Start_Time,
'14:45:00' AS Course_End_Time
UNION ALL
SELECT 543 AS Id,
'Eng 200' AS Course_Name,
'1/13/2016' AS Course_Date,
'14:55:00' AS Course_Start_Time,
'15:55:00' AS Course_End_Time
UNION ALL
SELECT 543 AS Id,
'Eng 200' AS Course_Name,
'1/14/2016' AS Course_Date,
'18:00:00' AS Course_Start_Time,
'20:15:00' AS Course_End_Time)
SELECT Id,
Course_Name,
Course_Date,
Course_Start_Time,
Course_End_Time,
CASE
WHEN Course_End_Time + '00:30:00' <= LEAD(Course_Start_Time, 1, 0) OVER (ORDER BY Course_Name,
Course_Date,
Course_Start_Time,
Course_End_Time
) THEN
RANK() OVER (PARTITION BY Id,
Course_Date
ORDER BY Course_Start_Time,
Course_End_Time
)
ELSE
1
END AS GENERATED_SEQUENCE
FROM cteCourse;
,cteGenSeq AS (
SELECT Id,
Course_Name,
Course_Date,
Course_Start_Time,
Course_End_Time,
CASE
WHEN Course_End_Time + '00:30:00' <= LEAD(Course_Start_Time, 1, 0) OVER (ORDER BY Course_Name,
Course_Date,
Course_Start_Time,
Course_End_Time
) THEN
RANK() OVER (PARTITION BY Id,
Course_Date
ORDER BY Course_Start_Time,
Course_End_Time
)
ELSE
1
END AS GENERATED_SEQUENCE
FROM cteCourse
)
SELECT * FROM cteGenSeq