查看和复杂查询计数员工留在SQL中的不同位置
我有一个视图,看起来像这个视图\u 1: 我想找到员工最长停留时间的办公室,以及他停留的不同办公地点的数量 预期产量查看和复杂查询计数员工留在SQL中的不同位置,sql,sql-server,Sql,Sql Server,我有一个视图,看起来像这个视图\u 1: 我想找到员工最长停留时间的办公室,以及他停留的不同办公地点的数量 预期产量 id Max_time_in_Office Days Distinct_office_locations 1 Office1 36 2 5 Office2 43 2 所以id 1在office 1中花费了6天和30天,总共36天。他在第一办公室
id Max_time_in_Office Days Distinct_office_locations
1 Office1 36 2
5 Office2 43 2
所以id 1在office 1中花费了6天和30天,总共36天。他在第一办公室的时间最多。不同的位置是2。
id 5在办公室工作了13天和30天,共43天。最长时间在办公室2。不同的位置是2
代码尝试
select v.*
from (select v.id, v.office, sum(days) as Max_time_in_Office, count(Office) as Distinct_office_locations,
rank() over (partition by id order by sum(days) desc) as seqnum
from view_1 v
group by id, office
) v
where seqnum = 1;
获得的产出
id Max_time_in_Office Days Distinct_office_locations
1 Office1 36 1
5 Office2 43 1
所以我得到了错误的输出。有人能帮忙吗。您需要一个窗口函数:
select v.*
from (select v.id, v.office, sum(days) as Max_time_in_Office,
count(*) over (partition by id) as Distinct_office_locations,
rank() over (partition by id order by sum(days) desc) as seqnum
from view_1 v
group by id, office
) v
where seqnum = 1;
基本上,窗口函数计算聚合后返回的行数,每个办公室有一行。关闭。您需要一个窗口函数:
select v.*
from (select v.id, v.office, sum(days) as Max_time_in_Office,
count(*) over (partition by id) as Distinct_office_locations,
rank() over (partition by id order by sum(days) desc) as seqnum
from view_1 v
group by id, office
) v
where seqnum = 1;
基本上,窗口函数计算聚合后返回的行数-每个办公室有一行。您可以使用apply操作符实现这一点:
select V.Id,
T.Max_Time_Office,
T.Days,
Distinct_office_locations = count(distinct V.Office)
from view_1 V
Cross apply
(
Select top 1 Id,
Max_Time_Office = Office,
Days = sum(Days)
From view_1 VG
where V.Id = VG.Id
group by VG.Id, VG.Office
order by sum(Days) desc
) T
group by V.Id, T.Max_Time_Office, T.Days
基本上,您将在交叉应用程序中获得按sumDays desc排序的大多数天数的Office,并在外部表达式中使用它。然后,我刚刚对countdistinct V.Office进行了一次计算,以获得不同的办公室。您可以使用apply操作符来实现:
select V.Id,
T.Max_Time_Office,
T.Days,
Distinct_office_locations = count(distinct V.Office)
from view_1 V
Cross apply
(
Select top 1 Id,
Max_Time_Office = Office,
Days = sum(Days)
From view_1 VG
where V.Id = VG.Id
group by VG.Id, VG.Office
order by sum(Days) desc
) T
group by V.Id, T.Max_Time_Office, T.Days
基本上,您将在交叉应用程序中获得按sumDays desc排序的大多数天数的Office,并在外部表达式中使用它。然后我只是做了一次统计,以得到不同的办公室