我有一个类似于这个view_1的视图
id Office Begin_dt Last_dt Days
1 Office1 2019-09-02 2019-09-08 6
1 Office2 2019-09-09 2019-09-30 21
1 Office1 2019-10-01 2019-10-31 30
5 Office3 2017-10-01 2017-10-16 15
5 Office2 2017-10-17 2017-10-30 13
5 Office2 2017-11-01 2017-11-31 30 我想找到员工最多停留时间的办公室,以及他呆在不同的办公地点的数量。
预期产出
id Max_time_in_Office Days Distinct_office_locations
1 Office1 36 2
5 Office2 43 2所以,我在办公室里花了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所以我的输出是错误的。有人能帮忙吗?
发布于 2020-08-10 17:25:48
关。你想要一个窗口函数:
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;基本上,窗口函数是计算聚合后返回的行数--每个office有一行。
发布于 2020-08-10 18:00:55
您可以使用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基本上,您将得到顺序中大多数天的Office,在交叉应用中通过sum( days ) desc,并在外部表达式中使用它。然后,我做了一个计数(不同的V.Office),以获得不同的办公室。
https://stackoverflow.com/questions/63345055
复制相似问题