Sql 我如何根据最近的输入日期从不同的行中选择值,所有这些值都是针对同一员工ID的?
基本上,我有一个表,用于保存员工工作服的详细信息。它由以下几列组成:Sql 我如何根据最近的输入日期从不同的行中选择值,所有这些值都是针对同一员工ID的?,sql,sql-server,select,Sql,Sql Server,Select,基本上,我有一个表,用于保存员工工作服的详细信息。它由以下几列组成: EmployeeID, CostCentre, AssociateLevel, IssueDate, TrouserSize, TrouserLength, TopSize & ShoeSize. 可以同时为员工分配一条裤子、一件上衣和一双鞋,也可以只分配一件或两件衣服。我们都知道,人们的规模和员工水平可能会发生变化,这就是我真正需要帮助的原因。不同类型的员工(AssociateLevel)需要不同颜色的衣服,但您
EmployeeID, CostCentre, AssociateLevel, IssueDate, TrouserSize, TrouserLength, TopSize & ShoeSize.
可以同时为员工分配一条裤子、一件上衣和一双鞋,也可以只分配一件或两件衣服。我们都知道,人们的规模和员工水平可能会发生变化,这就是我真正需要帮助的原因。不同类型的员工(AssociateLevel)需要不同颜色的衣服,但您可以忽略这一部分。每次员工收到一件衣服时,都会在表中插入一个带有输入日期的新行。我需要能够为每个员工的每件衣服选择最新的衣服尺寸
并非所有列都必须包含值,因为员工可以在一年中的不同时间收到裤子或马球衫
例如,如果员工“54664LSS”在2011年3月24日收到一条“XL”长裤和一件“L”上衣,但在2010年5月26日收到一件“M”上衣。这些项目的输入显然对两个不同的行有帮助。因此,如果我想为每个服装类别选择最新的服装。然后需要返回“M”号上衣和“L”号裤子的值
如果有任何帮助,我将不胜感激,因为我被困住了
(抱歉,我编辑了这条sql大约6次,直到我找到了我认为是答案的地方)
假设-只有一个“发布日期”列。您可以在发布日期发布多个项目,但不需要同时查看这些结果(否则我们将不得不对联合结果进行分组)。如果没有发布项目,则该列中会显示空值
不确定如果服装问题之间的关联级别发生变化,您的逻辑会是什么如果您能给出一个模式定义和一些示例数据,以及预期的输出,而不是注释,回答起来总是比较容易。我尝试了一个模式定义,但没有任何示例数据,并且认为这个答案给出了您想要的:
/*create table Clothing (
EmployeeID int not null,
CostCentre varchar(10) not null,
AssociateLevel int not null,
IssueDate datetime not null,
TrouserSize int null,
TrouserLength int null,
TopSize varchar(4) null,
ShoeSize varchar(10) null
)*/
go
with Trousers as (
select
EmployeeID,
CostCentre,
AssociateLevel,
IssueDate,
TrouserSize,
TrouserLength,
RANK() OVER (PARTITION BY EmployeeID ORDER BY IssueDate Desc) as RowNum
from
Clothing
where
TrouserSize is not null
), Tops as (
select
EmployeeID,
CostCentre,
AssociateLevel,
IssueDate,
TopSize,
RANK() OVER (PARTITION BY EmployeeID ORDER BY IssueDate Desc) as RowNum
from
Clothing
where
TopSize is not null
), Shoes as (
select
EmployeeID,
CostCentre,
AssociateLevel,
IssueDate,
ShoeSize,
RANK() OVER (PARTITION BY EmployeeID ORDER BY IssueDate Desc) as RowNum
from
Clothing
where
ShoeSize is not null
)
select
COALESCE(tr.EmployeeID,tops.EmployeeID,sh.EmployeeID) as EmployeeID,
tr.CostCentre,
tr.AssociateLevel,
tr.IssueDate,
tr.TrouserSize,
tr.TrouserLength,
tops.CostCentre,
tops.AssociateLevel,
tops.IssueDate,
tops.TopSize,
sh.CostCentre,
sh.AssociateLevel,
sh.IssueDate,
sh.ShoeSize
from
Trousers tr
full outer join
Tops
on
tr.EmployeeID = Tops.EmployeeID
full outer join
Shoes sh
on
tr.EmployeeID = sh.EmployeeID and
Tops.EmployeeID = sh.EmployeeID
where
(tr.RowNum is null or tr.RowNUm = 1) and
(Tops.RowNum is null or Tops.RowNUm = 1) and
(sh.RowNum is null or sh.RowNum = 1)
如果你有女性员工,我会将生成的报告视为机密信息:-)有疑问。为什么在更新可以轻松解决问题时插入新行?当然,如果它已经存在,或者它是日志或归档等的某种设计决策,那么你什么也做不了。@blntechie-我认为审计历史非常重要。当然,现在的冷衣服也是一种使用方法。@James是的,我已经说过了,我接受这一点。我只是想知道他们是否已经实施了CDC或其他审计跟踪技术,这样他们就可以简单地进行更新。嘿,是的,我向要求更新的人提出了这个问题,但他们说他们想要收到的每件衣服的记录。没有疾病控制中心,不确定这是什么开始?目前的系统只是一个纸面记录。有一个关于当前工作磨损的表和一个关于工作磨损历史的表感谢您的回复,我还没有测试它,但基本上我想用sql的输出构建一个新表,并从中生成报告。因此,我认为我不能真正指定确切的员工ID是什么,因为我需要为2000多名员工指定。这是我发现它如此令人困惑的原因之一。我已经测试了SQL,但它没有运行,说“UNION”附近的语法不正确。我以前从未使用过union,因此将查看它的工作原理。哦,还有……是的,你是对的,每个条目只有一个发行日期。:)我删除了工会,因为它不能与订单结合。哇,谢谢你的努力。很抱歉,这是我的第一篇文章,当我发布它时,我有点匆忙。这并不意味着听起来模棱两可。
/*create table Clothing (
EmployeeID int not null,
CostCentre varchar(10) not null,
AssociateLevel int not null,
IssueDate datetime not null,
TrouserSize int null,
TrouserLength int null,
TopSize varchar(4) null,
ShoeSize varchar(10) null
)*/
go
with Trousers as (
select
EmployeeID,
CostCentre,
AssociateLevel,
IssueDate,
TrouserSize,
TrouserLength,
RANK() OVER (PARTITION BY EmployeeID ORDER BY IssueDate Desc) as RowNum
from
Clothing
where
TrouserSize is not null
), Tops as (
select
EmployeeID,
CostCentre,
AssociateLevel,
IssueDate,
TopSize,
RANK() OVER (PARTITION BY EmployeeID ORDER BY IssueDate Desc) as RowNum
from
Clothing
where
TopSize is not null
), Shoes as (
select
EmployeeID,
CostCentre,
AssociateLevel,
IssueDate,
ShoeSize,
RANK() OVER (PARTITION BY EmployeeID ORDER BY IssueDate Desc) as RowNum
from
Clothing
where
ShoeSize is not null
)
select
COALESCE(tr.EmployeeID,tops.EmployeeID,sh.EmployeeID) as EmployeeID,
tr.CostCentre,
tr.AssociateLevel,
tr.IssueDate,
tr.TrouserSize,
tr.TrouserLength,
tops.CostCentre,
tops.AssociateLevel,
tops.IssueDate,
tops.TopSize,
sh.CostCentre,
sh.AssociateLevel,
sh.IssueDate,
sh.ShoeSize
from
Trousers tr
full outer join
Tops
on
tr.EmployeeID = Tops.EmployeeID
full outer join
Shoes sh
on
tr.EmployeeID = sh.EmployeeID and
Tops.EmployeeID = sh.EmployeeID
where
(tr.RowNum is null or tr.RowNUm = 1) and
(Tops.RowNum is null or Tops.RowNUm = 1) and
(sh.RowNum is null or sh.RowNum = 1)