最长时段

时间:2019-09-19 19:45:23

标签: sql oracle

我有一个数据集,其中列出了ID(EmployeeID),以季度和年为单位的时间段,四位数代码,年份的后两个数字是前两个数字,四分之一是后两个数字。 2013年第1季度将为“ 1301”(季度),其中包括在职员工和以前的员工。它还具有销售(销售)。数据集每个ID每季度有一行。我需要最近一个季度的销售。

这是我的代码:

select EmployeeID, max(Quarter), Sales
from dataset;

显然这是错误的,因为它希望我按员工编号和销售额等进行分组,并且为每个员工编号提供多个行。

参见上文。

我需要每个EmployeeID 1行的输出,以提供他们最近的季度以及该季度的销售额。

4 个答案:

答案 0 :(得分:0)

无需使用窗口函数,就可以创建一个派生表,该表具有每位员工和最大季度的一条记录,然后将内部联接返回到数据集。

;WITH MaxQuarter AS(select EmployeeID, MaxQuarter = max(Quarter) from dataset)

select EmployeeID, Quarter, Sales 
from dataset ds
inner join MaxQuarter m on m.EmployeeID = ds.EmployeeID and m.MaxQuarter = ds.Quarter 

答案 1 :(得分:0)

如果您使用的是SQL Server,则可以使用公用表表达式

WITH MaxQuarters(EmployeeID, MaxQuarter)  
AS   
(  
    SELECT EmployeeID, MAX(Quarter) as MaxQuarter  
    FROM dataset  
    GROUP BY EmployeeID
)  
SELECT EmployeeID, Quarter, Sales  
FROM dataset ds
JOIN MaxQuarters mq on ds.EmployeeID = mq.EmployeeID 

答案 2 :(得分:0)

上一季度的所有销售额:

select *
from dataset
where quarter = (select max(quarter) from dataset);

员工持续进行的所有销售(即每位员工上一个季度=上个季度不同)

select *
from dataset
where (employeeid, quarter) in
(
  select employeeid, max(quarter)
  from dataset
  group by employeeid
);

答案 3 :(得分:0)

如果要获得最近的一个季度总体信息:

select ds.*
from dataset ds
where ds.quarter = (select max(ds2.quarter) from dataset ds2);

如果您想要每个员工最多

select ds.*
from dataset ds
where ds.quarter = (select max(ds2.quarter)
                    from dataset ds2
                    where ds2.employeeid = ds.employeeid
                   );

或者,在Oracle中,您可以使用keep和聚合:

select employeeid, max(quarter),
       max(sales) keep (dense_rank first order by quarter desc) as sales
from dataset
group by employeeid