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
- 奖励:匿名化敏感数据
自己回答:
您应该首先改进时间表示,因为字符串“HH:mm”格式没有给出如何在 23:30 之后排序 01:30 的线索。可能您希望日期时间类型被截断或四舍五入为分钟。让我们将其命名为 cas_od
、cas_do
,就像您的代码片段中一样。
然后定义所有范围的有序集:
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
)
)
- 然后计算每个范围内的在职员工人数(可能存在边界错误,但我希望你能理解):
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
美好的一天,
下面的“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
- 奖励:匿名化敏感数据
自己回答:
您应该首先改进时间表示,因为字符串“HH:mm”格式没有给出如何在 23:30 之后排序 01:30 的线索。可能您希望日期时间类型被截断或四舍五入为分钟。让我们将其命名为
cas_od
、cas_do
,就像您的代码片段中一样。然后定义所有范围的有序集:
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
)
)
- 然后计算每个范围内的在职员工人数(可能存在边界错误,但我希望你能理解):
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