Sql 最长时间段

Sql 最长时间段,sql,oracle,Sql,Oracle,我有一个数据集,列出ID(EmployeeID),季度和年份的时间段,四位数代码,年份的最后两个数字是前两个数字,季度数字是后两个数字。2013年第一季度为“1301”(季度),包括在职员工和以前的员工。它也有销售。数据集每个ID每季度有一行。我需要最近一个季度的销售额 这是我的密码: select EmployeeID, max(Quarter), Sales from dataset; 显然,这是错误的,因为它希望我按employeeid和sales等进行分组,并为每个employeeid

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

这是我的密码:

select EmployeeID, max(Quarter), Sales
from dataset;
显然,这是错误的,因为它希望我按employeeid和sales等进行分组,并为每个employeeid提供多行

见上文


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

不使用窗口函数,您可以为每个员工和最大季度创建一个包含一条记录的派生表,然后将其内部联接回数据集

;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 

不使用窗口函数,您可以为每个雇员和最大季度创建一个包含一条记录的派生表,然后将其内部联接回数据集

;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 

如果您使用的是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 

如果您使用的是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 

上季度的所有销售额:

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
);
一名员工最后完成的所有销售(即每位员工的最后一个季度=不同的最后一个季度):

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
);

上季度的所有销售额:

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
);
一名员工最后完成的所有销售(即每位员工的最后一个季度=不同的最后一个季度):

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
);

如果要查看最近一个季度的总体情况:

select ds.*
from dataset ds
where ds.quarter = (select max(ds2.quarter) from dataset ds2);
如果您想要每个员工的最大值:

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

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

如果要查看最近一个季度的总体情况:

select ds.*
from dataset ds
where ds.quarter = (select max(ds2.quarter) from dataset ds2);
如果您想要每个员工的最大值:

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

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

共享示例输入和所需输出数据您使用的rdbms是什么?oracle sql,抱歉。@dbwhite64将澄清作为对您的问题的编辑而不是评论发布。仅供参考,更常见的是,季度用4位数的年份、一个
Q
和一位数表示。有些人可能会在year和
Q
之间加上连字符。例如:
2019Q1
2019-Q1
。虽然未在中定义,但后一种样式遵循该标准的约定。共享示例输入和所需输出数据您使用的rdbms是什么?oracle sql,抱歉。@dbwhite64将澄清作为对您的问题的编辑而不是注释发布。仅供参考,更常见的情况是,季度用4位数的年份表示,a
Q
,和一个一位数的数字。有些人可能会在year和
Q
之间加上连字符。例如:
2019Q1
2019-Q1
。虽然没有在中定义,但后一种风格遵循了该标准的惯例。我感谢时间。oracle版本在第2行的“dec”之后给了我一个“缺少右括号”错误。有什么建议吗?@dbwhite64:那是个打字错误。使其
desc
表示“下降”。(您也可以按升序将其完全删除,并将
first
改为
last
。)非常感谢您抽出时间。oracle版本在第2行的“dec”之后给了我一个“缺少右括号”错误。有什么建议吗?@dbwhite64:那是个打字错误。使其
desc
表示“下降”。(您也可以按升序将其完全删除,并将
first
改为
last
。)