完整的SQL新手所以请善待。我有以下声明:
SELECT DISTINCT
tTMPO."OperationRecordID"
, tTMPO."CasenoteNumber"
, tTMPO."DateTimeBooked"
, tSPPS."StartDate"
, AEAdm."Visit Date"
, AEAdm."Visit Time"
, AEAdm."Episode Number"
, AEAdm.[Visit Number]
FROM
(("TheatreLive"."dbo"."tblSPPlannedSession" tSPPS
LEFT OUTER JOIN
"TheatreLive"."dbo"."tblTMPlannedOperation" tTMPO ON tSPPS."SessionRecordID" = tTMPO."SessionRecordID")
LEFT OUTER JOIN
"TheatreLive"."dbo"."tblTMActualOperation" tTMAO ON tTMPO."OperationRecordID" = tTMAO."OperationRecordID")
LEFT OUTER JOIN
"TheatreLive"."dbo"."cavAEAdmissions" AEAdm ON tTMAO."CasenoteNumber"=AEAdm."CRN" COLLATE DATABASE_DEFAULT
WHERE
tSPPS."StartDate" < DateAdd(day, 2, AEAdm."Visit Date")
AND AEAdm."Visit Date" < tSPPS."StartDate"
我使用了DISTINCT
但请注意,当出现多个剧集编号时,OperationRecordID
会出现多行。我尝试添加SELECT TOP 1
但是需要添加WHERE
子句中的完整逻辑,这些逻辑运行异常缓慢。
WHERE
子句用于缩小结果集的范围,因此只查找彼此在2天内的日期。
基本上,对于每个不同的OperationRecordID
,我需要最新的剧集编号,如果出现超过1个访问号码,那么也是最高的访问号码。这两个都应该能够使用MAX
子句进行选择。
思想?
答案 0 :(得分:0)
DISTINCT关键字适用于所有选定的列 - 而不仅仅是之前显示的列。听起来您可能需要使用GROUP BY的Max函数,或者根据您的条件的复杂程度,使用内联表。
像
这样的东西SELECT
tTMPO."OperationRecordID"
, tTMPO."CasenoteNumber"
, tTMPO."DateTimeBooked"
, tSPPS."StartDate"
, AEAdm."Visit Date"
, AEAdm."Visit Time"
, Max(AEAdm."Episode Number")
, Max(AEAdm.[Visit Number])
FROM
(("TheatreLive"."dbo"."tblSPPlannedSession" tSPPS
LEFT OUTER JOIN
"TheatreLive"."dbo"."tblTMPlannedOperation" tTMPO ON tSPPS."SessionRecordID" = tTMPO."SessionRecordID")
LEFT OUTER JOIN
"TheatreLive"."dbo"."tblTMActualOperation" tTMAO ON tTMPO."OperationRecordID" = tTMAO."OperationRecordID")
LEFT OUTER JOIN
"TheatreLive"."dbo"."cavAEAdmissions" AEAdm ON tTMAO."CasenoteNumber"=AEAdm."CRN" COLLATE DATABASE_DEFAULT
WHERE
tSPPS."StartDate" < DateAdd(day, 2, AEAdm."Visit Date")
AND AEAdm."Visit Date" < tSPPS."StartDate"
GROUP BY tTMPO."OperationRecordID"
, tTMPO."CasenoteNumber"
, tTMPO."DateTimeBooked"
, tSPPS."StartDate"
, AEAdm."Visit Date"
, AEAdm."Visit Time"
答案 1 :(得分:0)
我使用以下内容修改了@amcdermott的代码,以尝试根除单独的日期和时间字段似乎导致的重复:
SELECT
tTMPO.[OperationRecordID]
, tTMPO.[CasenoteNumber]
, tTMPO.[DateTimeBooked]
, tSPPS.[StartDate]
/* , AEAdm.[Visit Date]
, AEAdm.[Visit Time]*/
, MAX (CONVERT(DATETIME, CONVERT(CHAR(8), AEAdm.[Visit Date], 112)
+ ' ' + CONVERT(CHAR(8), AEAdm.[Visit Time], 108))) as Visit
, MAX(AEAdm.[Episode Number]) as Epi#
, MAX(AEAdm.[Visit Number]) as Visit#
FROM
((TheatreLive.dbo.tblSPPlannedSession tSPPS
LEFT OUTER JOIN
TheatreLive.dbo.tblTMPlannedOperation tTMPO ON tSPPS.SessionRecordID = tTMPO.SessionRecordID)
LEFT OUTER JOIN
TheatreLive.dbo.tblTMActualOperation tTMAO ON tTMPO.OperationRecordID = tTMAO.OperationRecordID)
LEFT OUTER JOIN
TheatreLive.dbo.cavAEAdmissions AEAdm ON tTMAO.CasenoteNumber=AEAdm.CRN COLLATE DATABASE_DEFAULT
WHERE
tSPPS.StartDate < DateAdd(day, 5, AEAdm.[Visit Date])
AND AEAdm.[Visit Date] < tSPPS.StartDate
GROUP BY tTMPO.OperationRecordID
, tTMPO.CasenoteNumber
, tTMPO.DateTimeBooked
, tSPPS.StartDate
/* , AEAdm.[Visit Date]
, AEAdm.[Visit Time]
, AEAdm.[Episode Number]*/
这个有效!感谢大家。希望代码也更清洁;-)告诉你我是新手。