加入SQL查询MAX聚合条件

时间:2014-07-27 04:10:58

标签: sql postgresql

我遇到SQL查询问题。这是我在SQL Fiddle上的模式的表示:

http://sqlfiddle.com/#!15/14c8e/1

问题是我想从Invitations表中返回数据行,并使用相关事件中的'sent'event_type和'Viewed'event_type以及最新的created_at日期来加入它们。 / p>

我可以获取所有数据和计数,但是我遇到了last_sent_on的问题。有没有办法在MAX聚合函数中使用条件? 例如

MAX(
  SELECT events.created_at
  WHERE event_type='sent'
)

如果没有,我将如何编写正确的子选择?

我目前正在使用Postgresql。

谢谢。

2 个答案:

答案 0 :(得分:0)

尝试使用子查询来构建已发送的最大值。

SELECT
    i.id,
    i.name,
    i.email,
    sent.last_sent,
    sum(case when e.event_type='sent' then 1 else 0 end) AS sent_count,
    sum(case when e.event_type='viewed' then 1 else 0 end) AS view_count
FROM
    invitations i
LEFT OUTER JOIN
    events e
    ON e.eventable_id = i.id
LEFT JOIN ( SELECT eventable_id uid, MAX(created_at) AS last_sent
            FROM events 
            WHERE event_type = 'sent'
            GROUP BY eventable_id ) AS sent
  ON sent.uid = i.id
WHERE e.eventable_type='Invitation'
GROUP BY i.id, i.name, i.email, sent.last_sent

答案 1 :(得分:0)

你可以在max中使用case语句,就像你已经完成了sum一样。以下查询将为created_at

选择最大event_type='sent'
SELECT
    i.id,
    i.name,
    i.email,
    max(case when e.event_type='sent' then e.created_at end) AS last_sent_on,
    sum(case when e.event_type='sent' then 1 else 0 end) AS sent_count,
    sum(case when e.event_type='viewed' then 1 else 0 end) AS view_count
FROM
    invitations i
LEFT OUTER JOIN
    events e
    ON e.eventable_id = i.id
WHERE e.eventable_type='Invitation'
GROUP BY i.id, i.name, i.email

SQLFiddle