使用子查询查询Min和Max结果

时间:2017-07-22 05:56:54

标签: sql max min

我需要有关sql查询的帮助。我正在使用Sql Server Management Studio,相关字段是:

Employees.Id

Employees.Name

Events.Employee_Id

Events.DateTime

为每个员工/日期(非日期时间)组合返回一条记录的最有效方法是什么?名称,分钟(日期时间),最大值(日期时间)以及每个员工/日期组合的小时数增量?

3 个答案:

答案 0 :(得分:0)

简单的方法是将JoinMin/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无法对包含聚合或子查询的表达式执行聚合函数”。