SELECT DISTINCT创建多行

时间:2015-06-29 15:43:29

标签: sql-server tsql select distinct where-clause

完整的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子句进行选择。

思想?

2 个答案:

答案 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]*/

这个有效!感谢大家。希望代码也更清洁;-)告诉你我是新手。