【问题标题】:SQL: Select time period COUNT() of employeesSQL:选择员工的时间段 COUNT()
【发布时间】:2021-12-15 23:40:05
【问题描述】:

早安,

下面的“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 独自往返,另一名员工独自往返等等。提前谢谢您。

【问题讨论】:

    标签: sql date select time count


    【解决方案1】:

    如果你这样做,你的问题更有可能得到回答

    • 指定您的数据库供应商(而不是不必要的select 标签)
    • 提供简约示例(没有基础表或不相关的 where 条件)
    • 提供 db fiddle
    • 奖励:匿名化敏感数据

    回答自己:

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

    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
    

    【讨论】:

    • 非常感谢您的帮助,时间段看起来正确,但一个问题是范围 od day。因为如果一名员工从 22:00 开始工作到第二天,那么他的结果就是 null。
    • 第二个问题是计数。现在我有四个正确的结果,但计数看我的价值为 2、4、4、4,但正确的是 1、2、8、7。因为我有 8 个人。第一个工作在22:00-00:30单独工作,两个工作在0:30-1:30工作,八个工作在1:30-5:00工作,7个工作在5:00-6:00工作。所有人都有相同的结束时间。
    • 请在我的回答开头提到的四点改进问题。否则,如果不查看数据 sn-p 以及您正在尝试的内容,很难帮助您。创建 db fiddle,让我们讨论一下。
    • 我真的为我的不准确问题道歉,但我发现了问题。您的选择正常工作。问题出在我的选择中,但你能告诉我如果我只选择时间段,我该如何添加关于机器的时间段信息。正是我选择的“linka.xLinka,linka.xDoklad”中的这一行
    • 如果您的 linedocument 列是常量,如您的示例中所示,您可以安全地将它们放入 select 'Balíčky', ... from times 查询中。否则,有必要描述它们在什么上下文中变化。例如,在同一linedocument 的记录组内是否要处理一系列时间点?最小的可重复示例会给出答案,很抱歉我没有机会从提供的示例中猜出它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 2022-01-16
    • 2012-06-17
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多