SQL:Select 个时间段的员工人数 COUNT()

SQL: Select time period COUNT() of employees

美好的一天,

下面的“SELECT”显示的是员工人数及到达和离开时间。

在这个数据中,我需要找出每个时间的员工总数(COUNT)(我不需要处理秒)。给定时间内有多少人同时工作。

示例:

SELECT 
    linka.xLinka
    , linka.xDoklad
    , zam.xPracovnik
    , FORMAT(zam.xCasOd, 'HH:mm') as cas_od
    , FORMAT(zam.xCasDo, 'HH:mm') as cas_do
FROM [K2CA_CA].[dbo].[_OV_Data01] as linka
LEFT OUTER JOIN dbo._OV_Data03 as zam ON zam.xLinka = linka.xLinka and zam.xDoklad = linka.xDoklad
WHERE linka.xRok = 2021
    --AND linka.xDen  >= '2021-10-20' and linka.xDen <= '2021-10-26'
    AND (zam.xPozice like '%Bale%' or zam.xPozice like '%Plnič%')

结果:

Line                   Document       Employee            Arrival   Departure
--------------------------------------------------------------------------------------------
 | Balíčky, výroba nových NV   |   VL/2021/4072   |   Vaněček Karel       |   22:00 06:00
 | Balíčky, výroba nových NV   |   VL/2021/4072   |   Levá Pavlína        |   23:30 06:00
 | Balíčky, výroba nových NV   |   VL/2021/4072   |   Škorňová Alena      |   01:30 06:00
 | Balíčky, výroba nových NV   |   VL/2021/4072   |   Trofimov Jurii      |   01:30 06:00
 | Balíčky, výroba nových NV   |   VL/2021/4072   |   Besahina Olena      |   01:30 06:00
 | Balíčky, výroba nových NV   |   VL/2021/4072   |   Havel Zdeněk        |   01:30 06:00
 | Balíčky, výroba nových NV   |   VL/2021/4072   |   Schmiedlová Ilona   |   01:30 06:00
 | Balíčky, výroba nových NV   |   VL/2021/4072   |   Kulenová Jinřiška   |   01:30 06:00
 --------------------------------------------------------------------------------------------

结果,我需要赚取:

Line                   Document       COUNT(*)            Arrival   Departure
--------------------------------------------------------------------------------------------
 | Balíčky, výroba nových NV   |   VL/2021/4072   |   1               |   22:00 23:30 (22 - 23:30) work only one employee)
 | Balíčky, výroba nových NV   |   VL/2021/4072   |   2               |   23:30 01:30 (23:30 - 1:30 works two employees - first arived at 22:00, second at 23:30))
 | Balíčky, výroba nových NV   |   VL/2021/4072   |   8               |   01:30 06:00 (8 employes work here from 1:30 to 06:00)
 --------------------------------------------------------------------------------------------

如何得到结果?或者我如何获得时间线定义?例如,员工 1 独自往返,另一名员工独自往返等等。在此先感谢您。

如果您

,您的问题更有可能得到回答
  • 指定您的数据库供应商(而不是不必要的 select 标签)
  • 提供最简单的示例(没有基础表或不相关的 where 条件)
  • 提供数据库fiddle
  • 奖励:匿名化敏感数据

自己回答:

  1. 您应该首先改进时间表示,因为字符串“HH:mm”格式没有给出如何在 23:30 之后排序 01:30 的线索。可能您希望日期时间类型被截断或四舍五入为分钟。让我们将其命名为 cas_odcas_do,就像您的代码片段中一样。

  2. 然后定义所有范围的有序集:

with original as (
  ... your select with cas_od, cas_do and other preprocessed data
), times(cas_od,cas_do) as (
  select cas, lag(cas) over (order by cas) 
  from (
    select distinct cas_od as cas from original
    union
    select distinct cas_do as cas from original
  )
)
  1. 然后计算每个范围内的在职员工人数(可能存在边界错误,但我希望你能理解):
select t.cas_od, t.cas_do
     , (select count(*)
        from original o
        where o.cas_od<=t.cas_od and o.cas_do>=t.cas_do
       )
from times t