首页 > 解决方案 > SQL Server 分区窗口中多个属性的 Min() 和 Max()

问题描述

我在 SQL Server 中有一个时间表,其中包含公共交通工具的[SERV_ID](service-id)、[STATION](station)、[ARR](arrivaltime)、 (departuretime)。[DEP]每项服务都可以每天都在场[SERV_DAY]

目标是总结Serviceday、Service-line、First-station、Last-station以及对应的时间戳。--> 每天每服务一行。

对于[SERV_ID]N170,这将是:

SERV_DAY                SERV_ID     FIRST_STATION   MIN_DEP                 LAST_STATION        MAX_ARR
2019-08-14 00:00:00     N170        Downtown        2019-08-14 06:06:00     CentralStation      2019-08-14 07:11:00

我试图通过([SERV_DAY], [SERV_ID])一个 then getMAX([ARR])MIN([DEP])每个分区进行分区来做到这一点。这工作了很长时间,但现在我想为每个最小值和最大值获取相应的站。

SELECT 
       [SERV_DAY],[SERV_ID],
       MAX([ARR]) OVER(PARTITION BY [SERV_DAY],[SERV_ID]) AS MAX_ARR,
       MIN([DEP]) OVER(PARTITION BY [SERV_DAY],[SERV_ID]) AS MIN_DEP 
FROM #demo

稍后我需要在最后一站添加延迟,这在数据集的扩展版本中可用,如[ARR_EFFECTIVE][DEP_EFFECTIVE]. 希望一旦我知道如何总结如上所述的每日线路,我就能够添加这些属性。

这个主题很接近,但我不知道如何 根据 sql server 中的分区调整“间隙和孤岛问题”Min() 和 Max()

我在 dbfiddle https://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=52e53d43a49ddb8f67454e576bfa7d74中设置了一个演示数据集

谁能帮我完成查询?

标签: sqlsql-serverwindow-functions

解决方案


SELECT 
       [SERV_DAY]
       ,[SERV_ID],
       FIRST_VALUE(STATION) over (Partition by [SERV_DAY],[SERV_ID] Order by ARR DESC) Station1
       , FIRST_VALUE(STATION) over (Partition by [SERV_DAY],[SERV_ID] Order by DEP ASC) Station2
FROM #demo

推荐阅读