我需要有关sql查询的帮助。我正在使用Sql Server Management Studio,相关字段是:
Employees.Id
Employees.Name
Events.Employee_Id
Events.DateTime
为每个员工/日期(非日期时间)组合返回一条记录的最有效方法是什么?名称,分钟(日期时间),最大值(日期时间)以及每个员工/日期组合的小时数增量?
答案 0 :(得分:0)
简单的方法是将Join
与Min/Max
聚合
select e.Name,Min(ev.[DateTime]),Max(ev.[DateTime])
from Employees e
Left join Events ev --change it to INNER JOIN if you don't want all the employees
ON e.Id = ev.Employee_Id
Group by e.Name
使用Apply
运算符
select e.Name,oa.MinDate,oa.MaxDate
from Employees e
Outer Apply( --change it to Cross Apply if you don't want all the employees
select Min(ev.[DateTime]),Max(ev.[DateTime])
from Events ev
Where e.Id = ev.Employee_Id) oa (MinDate,MaxDate
)
答案 1 :(得分:0)
窗口函数应该是最有效的方法。假设每个名称和日期/时间已经有一行:
select e.*,
max(e.datetime) over (partition by name),
min(e.datetime) over (partition by name),
(datediff(hours,
min(e.datetime) over (partition by name),
max(e.datetime) over (partition by name)
) as diff_in_hours
from events e;
答案 2 :(得分:0)
非常感谢您的回复。这个问题一定不清楚,因为你们两个解决方案都很相似,但不是我想要的。他们确实让我回去再从头开始尝试,我不知道为什么我一开始就没有尝试过这个,但下面是我要找的结果。在我的问题中,我改变了表/字段名称并忽略了我知道自己可以实现的要求,以使问题尽可能简单易读,这就是为什么这看起来如此不同:
SET DATEFIRST 1
SELECT e.IdEmpNum,
m.tFirstName,
m.tLastName,
convert(varchar(10), e.dtEventReal, 101) as "event_date",
convert(varchar(20), min(e.dtEventReal), 108) as "min",
convert(varchar(20), max(e.dtEventReal), 108) as "max",
round((datediff(minute,
min(e.dtEventReal),
max(e.dtEventReal)
)/60.0), 2) as "hours"
FROM tblEvents e INNER JOIN tblEmployees m ON e.IdEmpNum = m.iEmployeeNum
WHERE e.dtEventReal >= dateadd(day, 1-datepart(dw, getdate()), convert(date,getdate()))
GROUP BY e.IdEmpNum, m.tFirstName, m.tLastName, convert(varchar(10), e.dtEventReal, 101)
ORDER BY e.IdEmpNum, convert(varchar(10), e.dtEventReal, 101) ASC;
DATEFIRST和WHERE条件指定仅返回本周的事件。我现在唯一的问题是总结“小时”计算。我收到一个错误,“SQL Server无法对包含聚合或子查询的表达式执行聚合函数”。