【问题标题】:Left join grouped data(with min/max) without losing rows左连接分组数据(带最小值/最大值)而不丢失行
【发布时间】:2018-12-01 08:59:03
【问题描述】:

您好,提前谢谢您!我有以下查询来检索我需要的表(以绿色突出显示)。顶部 select 语句获取 min(eventdate),底部 select 语句(即 Unioned)获取 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)

谢谢, 亚当

【问题讨论】:

  • 请不要发布图片。发布纯文本并将其格式化为表格数据的“代码”。

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


【解决方案1】:

要实现这一点,您可以使用 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

【讨论】:

    猜你喜欢
    • 2013-11-03
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    相关资源
    最近更新 更多