我遇到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。
谢谢。
答案 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