问题
给定的问题涉及一个具有以下结构的表“员工”:
列名 | 类型 |
---|---|
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%之前。
源代码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%之前。
结论
从这些解决方案中,我们了解到SQL构建体的选择和操作顺序可以显着影响性能。第二个解决方案的性能更好,因为它避免了在减去之前单独总和“ in_time”和“ out_time”的需求,这可能是更强化的。但是,性能差异可能会因特定数据分布,SQL引擎的查询优化以及其他因素而异。
。在leetcode性能方面,解决方案排名如下:
- 源代码2
- 源代码1
但是,重要的是要注意,leetcode的性能并不能完全代表现实世界数据库的性能,因为许多其他因素都在发挥作用,包括索引,数据库设计和数据分发。
您可以在LeetCode中找到原始问题。
有关更有见地的解决方案和与技术相关的内容,请随时在Beacons page上与我联系。