【问题标题】:Performing an operation on the result of a query, without saving a table对查询结果执行操作,而不保存表
【发布时间】:2019-12-23 17:52:01
【问题描述】:

我对 SQL 和 T-SQL 很陌生,所以请原谅术语中的任何错误或者如果答案很明显 - 我什至不知道从哪里开始搜索这个问题的解决方案。

我在 T-SQL 服务器上只有 SELECT 权限。我有一个查询,它根据具有开始日期 (DATETIME) 和结束日期 (DATETIME) 的事件提取一堆信息。我想在我的查询结果中有一个计算列,指示此人是否刚刚参与了背靠背事件。

所以,像这样,“Back2Back”是所需的列:

PersonID    LastName    StartDate                EndDate                    Back2Back
006         Trevelyan   2019-12-01 09:30:00.000  2019-12-02 06:15:00.000    No
007         Bond        2019-12-01 12:15:00.000  2019-12-01 12:16:00.000    No
006         Trevelyan   2019-12-02 06:15:00.000  2019-12-02 15:15:00.000    Yes

ORDER BY 将在 StartDate 之前,如果这有帮助或有阻碍的话。

【问题讨论】:

    标签: tsql datetime sql-order-by calculated-columns


    【解决方案1】:

    您可以使用LAG 函数获取每个人上一个事件的结束时间,并将其与当前事件的开始时间进行比较。

    SELECT
      *
     ,CASE
        WHEN StartDate = LAG(EndDate) OVER (PARTITION BY PersonID ORDER BY StartDate)
          THEN 'Yes'
        ELSE 'No'
      END AS Back2Back
    FROM
      @mytable
    ORDER BY
      StartDate;
    

    结果:

    +----------+-----------+-------------------------+-------------------------+-----------+
    | PersonID | LastName  |        StartDate        |         EndDate         | Back2Back |
    +----------+-----------+-------------------------+-------------------------+-----------+
    |        6 | Trevelyan | 2019-12-01 09:30:00.000 | 2019-12-02 06:15:00.000 | No        |
    |        7 | Bond      | 2019-12-01 12:15:00.000 | 2019-12-01 12:16:00.000 | No        |
    |        6 | Trevelyan | 2019-12-02 06:15:00.000 | 2019-12-02 15:15:00.000 | Yes       |
    +----------+-----------+-------------------------+-------------------------+-----------+
    

    这假设“背靠背”是相当字面的。如果您想在其中增加一些时间,可以使用DATEDIFF 比较而不是直接相等。

    【讨论】:

      猜你喜欢
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 2011-09-19
      • 2013-01-08
      • 2010-10-31
      • 1970-01-01
      • 2021-04-19
      相关资源
      最近更新 更多