首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >视图和复杂查询计数在SQL中的不同位置

视图和复杂查询计数在SQL中的不同位置
EN

Stack Overflow用户
提问于 2020-08-10 17:24:25
回答 2查看 47关注 0票数 1

我有一个类似于这个view_1的视图

代码语言:javascript
复制
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  

我想找到员工最多停留时间的办公室,以及他呆在不同的办公地点的数量。

预期产出

代码语言:javascript
复制
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。

码试

代码语言:javascript
复制
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;

输出量

代码语言:javascript
复制
id      Max_time_in_Office Days      Distinct_office_locations
1       Office1            36             1
5       Office2            43             1

所以我的输出是错误的。有人能帮忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-10 17:25:48

关。你想要一个窗口函数:

代码语言:javascript
复制
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有一行。

票数 5
EN

Stack Overflow用户

发布于 2020-08-10 18:00:55

您可以使用apply操作符来实现这一点:

代码语言:javascript
复制
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),以获得不同的办公室。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63345055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档