Sql server 将生成的列添加到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

我试图弄清楚是否可以使用SQL生成一个人工列

鉴于下面的假数据,您如何创建一个名为
generated\u SEQUENCE
的生成列

规则如下:

  • 必须在同一课程中(Id)
  • 必须在同一日期(课程日期)
  • 每个课程的时间间隔必须在30分钟以内(课程开始时间和课程结束时间)
代码:

这可能吗

谢谢

这里有一个选项

子查询使用:

  • 课程结束日期的延迟(),因此我们可以在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”作为[课程结束时间]
联合所有
选择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