Подзапрос на получение значения MAX() из leftJoin

#sql #sql-server #sql-server-2012

#sql #sql-сервер #sql-server-2012

Вопрос:

У меня есть этот запрос в SQL Server, и я хотел бы знать, может ли он быть короче?

я создал подзапрос (с группой по) со всем столбцом, чтобы получить значение MAX() из 3 дат, которые поступают из таблицы left join .

Я думаю, что я не могу обойтись без подзапроса, чтобы получить MAX() из 3 дат.

 SELECT otherCol1
    ,otherCol2 
    ,MAX(UnsubscribedDate) AS UnsubscribedDate
    ,MAX(OpenedDate) AS OpenedDate
    ,MAX(ClickedDate) AS ClickedDate
FROM (
    SELECT otherCol1
        ,otherCol2
        ,tu.JoinDate AS UnsubscribedDate
        ,trkOp.Clicktime AS OpenedDate
        ,trkRes.Clicktime AS ClickedDate
    FROM v_members_email_occurrence vmec
    LEFT JOIN tracking_unsubscribed tu WITH (NOLOCK) ON tu.ReportId = vmec.SendingId
    LEFT JOIN tracking_opened trkOp WITH (NOLOCK) ON trkOp.ReportId = vmec.SendingId
    LEFT JOIN tracking_result trkRes WITH (NOLOCK) ON trkRes.ReportId = vmec.SendingId
    WHERE vmec.MemberId = @MemberId
    ) AS Result
GROUP BY otherCol1
        ,otherCol2
  

Ответ №1:

Вы можете агрегировать без подзапроса:

 SELECT otherCol1
    ,otherCol2
    ,MAX(tu.JoinDate) AS UnsubscribedDate
    ,MAX(trkOp.Clicktime) AS OpenedDate
    ,MAX(trkRes.Clicktime) AS ClickedDate
FROM v_members_email_occurrence vmec
LEFT JOIN tracking_unsubscribed tu WITH (NOLOCK) ON tu.ReportId = vmec.SendingId
LEFT JOIN tracking_opened trkOp WITH (NOLOCK) ON trkOp.ReportId = vmec.SendingId
LEFT JOIN tracking_result trkRes WITH (NOLOCK) ON trkRes.ReportId = vmec.SendingId
WHERE vmec.MemberId = @MemberId
GROUP BY otherCol1
        ,otherCol2