我试图从强制SQL程序中提取一些自定义报告,而不是在工作中使用,我遇到了几个问题。我可以轻松获取所需的所有数据,但对于每个唯一的人ID /任务ID组合,我只需要最新的值。此外,如果可能,我希望从截止日期或豁免日期列中选择最新值,以较大者为准。
PersonnelTrainingEvent PersonnelID TrainingEventTypeID DueDate WaiverDate Personnel ID TrainingEventType ID Taskcode PersonnelDetail PersonnelID
5351 25947 1/1/1900 1/1/1900 5351 25947 Mob2 5351
5351 28195 8/1/2012 1/1/1900 5351 28195 CA01 5351
5351 26551 7/29/2010 1/1/1900 5351 26551 Mob10 5351
5351 25947 1/31/2012 1/1/1900 5351 25947 Mob2 5351
5351 28196 11/1/2012 1/1/1900 5351 28196 CA02 5351
5418 28195 1/1/1900 1/1/1900 5418 28195 CA01 5418
5418 30174 1/1/1900 1/1/1900 5418 30174 PJ18 5418
5418 28624 1/31/2014 2/1/2014 5418 28624 GA42 5418
5418 28595 6/30/2014 6/30/2014 5418 28595 GA43 5418
5418 28196 1/1/1900 1/1/1900 5418 28196 CA02 5418
6022 28195 3/3/2011 1/1/1900 6022 28195 CA01 6022
6022 28885 10/31/20121/1/1900 6022 28885 CA07 6022
6022 28884 1/1/1900 1/1/1900 6022 28884 CA06 6022
6022 28884 1/31/1901 1/1/1900 6022 28884 CA06 6022
6022 28196 1/1/1900 1/1/1900 6022 28196 CA02 6022
6022 28196 2/28/2011 1/1/1900 6022 28196 CA02 6022
6022 28624 9/30/2013 1/1/1900 6022 28624 GA42 6022
6022 28595 2/28/2014 1/1/1900 6022 28595 GA43 6022
6022 30174 2/28/2014 1/1/1900 6022 30174 PJ18 6022
这是我正在使用的查询...
SELECT
PersonnelTrainingEvent.PersonnelID AS [PersonnelTrainingEvent PersonnelID]
,PersonnelTrainingEvent.TrainingEventTypeID
,PersonnelTrainingEvent.DueDate
,PersonnelTrainingEvent.WaiverDate
,Personnel.ID AS [Personnel ID]
,TrainingEventType.ID AS [TrainingEventType ID]
,TrainingEventType.Taskcode
,PersonnelDetail.PersonnelID AS [PersonnelDetail PersonnelID]
FROM
PersonnelTrainingEvent
INNER JOIN TrainingEventType
ON PersonnelTrainingEvent.TrainingEventTypeID = TrainingEventType.ID
INNER JOIN Personnel
ON PersonnelTrainingEvent.PersonnelID = Personnel.ID
INNER JOIN PersonnelDetail
ON Personnel.ID = PersonnelDetail.PersonnelID
WHERE
TrainingEventType.Taskcode IN (N'GA43', N'MOB2', N'CA01', N'CA02', N'Mob10', N'PJ67', N'CA06', N'CA07', N'T104', N'GA42', N'PJ18')
Group By
Personnel.ID, TrainingEventType.Taskcode;
我目前正在度假并被我的妻子瞪着,但我已经在这个问题上工作了3个星期了,而且我的头撞在了墙上。我在下面列出了一个优选结果的样本......
PersonnelTrainingEvent PersonnelID TrainingEventTypeID DueDate WaiverDate Personnel ID TrainingEventType ID Taskcode PersonnelDetail PersonnelID
5351 28195 8/1/2012 1/1/1900 5351 28195 CA01 5351
5351 26551 7/29/2010 1/1/1900 5351 26551 Mob10 5351
5351 25947 1/31/2012 1/1/1900 5351 25947 Mob2 5351
5351 28196 11/1/2012 1/1/1900 5351 28196 CA02 5351
5418 28195 1/1/1900 1/1/1900 5418 28195 CA01 5418
5418 30174 1/1/1900 1/1/1900 5418 30174 PJ18 5418
5418 28624 1/31/2014 2/1/2014 5418 28624 GA42 5418
5418 28595 6/30/2014 6/30/2014 5418 28595 GA43 5418
5418 28196 1/1/1900 1/1/1900 5418 28196 CA02 5418
6022 28195 3/3/2011 1/1/1900 6022 28195 CA01 6022
6022 28885 10/31/20121/1/1900 6022 28885 CA07 6022
6022 28884 1/31/1901 1/1/1900 6022 28884 CA06 6022
6022 28196 2/28/2011 1/1/1900 6022 28196 CA02 6022
6022 28624 9/30/2013 1/1/1900 6022 28624 GA42 6022
6022 28595 2/28/2014 1/1/1900 6022 28595 GA43 6022
6022 30174 2/28/2014 1/1/1900 6022 30174 PJ18 6022
<小时/> 以下是我看过的其他答案的链接,但我是通过做一个有点人来学习的,这些似乎有点帮助,但我不理解所有语法......
SQL Select, Specific Rows based on multiple conditions?
SQL server select distinct rows using most recent value only
SQL Select with Group By and Order By Date
SQL server select distinct rows using values before a certain date
How to select only the latest rows for each user?
Get Distinct rows from a result of JOIN in SQL Server
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=47479
Selecting latest rows in subgroups
我很感激任何帮助,因为我正在努力学习自己这样做。我将提供所请求的任何输入或屏幕截图,如果我增加足够的代表以允许它。谢谢!
答案 0 :(得分:0)
使用Common表格表达式
以下是要求的查询。
WITH cte ( personneltrainingeventpersonnelid, trainingeventtypeid, duedate,
waiverdate, personnelid, taskcode, personneldetailpersonnelid, dupcount)
AS (SELECT personneltrainingeventpersonnelid,
trainingeventtypeid,
duedate,
waiverdate,
personnelid,
taskcode,
personneldetailpersonnelid,
Row_number()
OVER(
partition BY personnelid
ORDER BY duedate, waiverdate) AS DupCount
FROM personneltrainingevent)
SELECT C.*
FROM cte C,
(SELECT personneltrainingeventpersonnelid,
personnelid,
Max(duedate) AS Maximum
FROM cte
GROUP BY personnelid,
personneltrainingeventpersonnelid) CC
WHERE C.personnelid = cc.personnelid
AND C.personneltrainingeventpersonnelid =
cc.personneltrainingeventpersonnelid
AND c.duedate = CC.maximum
ORDER BY C.personnelid
答案 1 :(得分:0)
你可能想要的东西是这样的:
SELECT Event.personnelId, Event.trainingEventTypeId, Event.dueDate, Event.waiverDate,
Event.taskCode
FROM (SELECT Event.personnelId, Event.trainingEventTypeId, Event.dueDate, Event.waiverDate,
TrainingEventType.taskCode
ROW_NUMBER() OVER(PARTITION BY Event.personnelId, Event.trainingEventTypeId
ORDER BY CASE WHEN Event.dueDate >= Event.waiverDate
THEN Event.dueDate
ELSE Event.waiverDate END DESC) rn
FROM PersonnelTrainingEvent Event
JOIN TrainingEventType
ON TrainingEventType.id = Event.trainingEventTypeId
AND TrainingEventType.taskCode IN (N'GA43', N'MOB2', N'CA01', N'CA02', N'Mob10', N'PJ67', N'CA06', N'CA07', N'T104', N'GA42', N'PJ18')) Event
WHERE Event.rn = 1
但是,它很难分辨,因为您提供的查询存在语法错误,有其他不需要的列,以及不应影响结果的引用表(表格可能至少有一个行,但没有引用这些表中的数据,并且通常不需要多行。
答案 2 :(得分:0)
感谢所有的帮助,但我回到了基础。我将连接的表格剪切掉,然后转到我需要的基本四列,没有翻译数据。一旦我这样做,我看到该表只创建了具有1900日期字段的重复条目,所以我只是使用WHERE子句去掉额外的条目。我对Clockwork-Muse的方法非常感兴趣,但是我一直收到一个没有意义的语法错误,一旦我看到问题,我就得到它的代码就是删除我需要的东西。再次感谢您的支持和信息。