左联接分组数据(具有最小/最大)而不会丢失行

时间:2018-06-21 22:57:30

标签: sql sql-server max left-join min

您好,谢谢!我有以下查询检索我需要的表(以绿色突出显示)。最上面的select语句获取min(eventdate),最下面的select语句(并集)获取min(eventdate)和max(eventdate)的串联。这是最重要的维护。这样就可以正常返回数据,但是现在我不得不将其余数据联接到该表中(以红色突出显示)。

我如何加入而不必将所有列分组并丢失一些数据。如果您查看图像,则可以看到返回的数据,因为不需要对事件时间进行分组,它们都是一样的。但是,情况并非总是如此,即使相同的ID,事件时间也会改变。任何帮助,将不胜感激。

(Select  id,__DisplayName, LEFT(cast(min(EventDate) as varchar), len(min(eventdate)) -7)Eventdate from     SP_HS_Marketing_ExtEvents WHERE __ApprovalStatus = 'Approved' and __EventType not in ('1','-1','-2')
group by ID, __DisplayName
Union ALL
Select  id,__DisplayName, 
LEFT(cast(min(EventDate) as varchar), len(min(eventdate)) -7) + ' - ' +  LEFT(cast(max(EventDate) as     varchar), len(max(eventdate)) -7) Eventdate from SP_HS_Marketing_ExtEvents WHERE  __ApprovalStatus =     'Approved' and __EventType = -2
group by ID, __DisplayName)

enter image description here 谢谢, 亚当

1 个答案:

答案 0 :(得分:0)

要实现此目的,您可以使用CTE查找最小和最大日期,然后再联接回原始表并concat +强制转换日期。

With cte as (
Select min(eventdate) as minDate, max(eventdate) as maxDate, Id 
from   SP_HS_Marketing_ExtEvents 
WHERE __ApprovalStatus = 'Approved' and __EventType not in ('1','-1','-2')
group by id
        )

        Select Distinct s.EventTitle,
        DATENAME(MONTH,cte.minDate) + ' ' + DATENAME(DAY,cte.minDate) + ' ' + RIGHT('00' + CAST(YEAR(cte.minDate) AS VARCHAR),2)
        + ' - ' +
        DATENAME(MONTH,cte.maxDate) + ' ' + DATENAME(DAY,cte.maxDate) + ' ' + RIGHT('00' + CAST(YEAR(cte.maxDate) AS VARCHAR),2) AS EventDate
        ,EventTime
        ,Location

        from  SP_HS_Marketing_ExtEvents as s
        join cte as cte
        on cte.ID = s.id

Rextester