找到每位员工花费的总时间| leetcode | MSSQL
#教程 #database #leetcode #mssql

问题

给定的问题涉及一个具有以下结构的表“员工”:

列名 类型
emp_id int
event_day 日期
in_time int
out_time int

(emp_id, event_day, in_time)构成主要键。该表记录了各种日期的员工的时间和外在,其中“ IN_TIME”和“ OUT_TIME”表示为1至1440之间的分钟。任务是计算每天每天花费的总时间。如果一名员工一天中不止一次进入并离开,则每个实例都应分别考虑。

解释

给定“员工”表:

emp_id event_day in_time out_time
1 2020-11-28 4 32
1 2020-11-28 55 200
1 2020-12-03 1 42
2 2020-11-28 3 33
2 2020-12-09 47 74

预期输出为:

emp_id total_time
2020-11-28 1 173
2020-11-28 2 30
2020-12-03 1 41
2020-12-09 2 27

在这里,对于每个员工,每天,我们通过从“ out_time”中的“ out_time”中的“ out_time”中的“ out_time”计算出在办公室所花费的总时间,然后将这些时间总结。

解决方案

我们将查看两个不同的SQL查询,以解决此问题并分析其性能。

源代码1

第一个解决方案每天为每个员工总结“ in_time”和“ out_time”,然后从'out_time'的总和中减去'in_time'的总和:

SELECT
    event_day [day],
    emp_id,
    SUM(out_time) - SUM(in_time) [total_time]
FROM Employees
GROUP BY
    event_day,
    emp_id

此解决方案的运行时间为1031ms,将其放在leetcode上的17.20%之前。

s1

源代码2

第二个解决方案通过首先从“ out_time”中减去每个记录的“ in_time”,然后求和这些值:

SELECT
    event_day [day],
    emp_id,
    SUM(out_time - in_time) [total_time]
FROM Employees
GROUP BY
    event_day,
    emp_id

该解决方案的运行时间为828ms,将其放在LeetCode上的38.6%之前。

s2

结论

从这些解决方案中,我们了解到SQL构建体的选择和操作顺序可以显着影响性能。第二个解决方案的性能更好,因为它避免了在减去之前单独总和“ in_time”和“ out_time”的需求,这可能是更强化的。但是,性能差异可能会因特定数据分布,SQL引擎的查询优化以及其他因素而异。

在leetcode性能方面,解决方案排名如下:

  1. 源代码2
  2. 源代码1

但是,重要的是要注意,leetcode的性能并不能完全代表现实世界数据库的性能,因为许多其他因素都在发挥作用,包括索引,数据库设计和数据分发。

您可以在LeetCode中找到原始问题。

有关更有见地的解决方案和与技术相关的内容,请随时在Beacons page上与我联系。

👉 Check out all the links on my beacons.ai page 👈