Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查看和复杂查询计数员工留在SQL中的不同位置_Sql_Sql Server - Fatal编程技术网

查看和复杂查询计数员工留在SQL中的不同位置

查看和复杂查询计数员工留在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天。他在第一办公室

我有一个视图,看起来像这个视图\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天。他在第一办公室的时间最多。不同的位置是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,并在外部表达式中使用它。然后我只是做了一次统计,以得到不同的办公室