这是“最大每组”查询的示例。我认为将其分为两个子查询然后将结果合并起来是最容易理解的。
第二个子查询使用窗口函数ROW_NUMBER对每个收件人的电子邮件进行编号,以最近的1开头,然后是2、3等等。
然后将第一个查询的结果与行号为1(即最新)的第二个查询的结果相结合。这样可以确保在有关系的情况下,每个收件人只能获得一行。
这是查询:
SELECT T1.Recipient, T1.EmailCount, T2.Status FROM
(
SELECT Recipient, COUNT(*) AS EmailCount
FROM Messages
GROUP BY Recipient
) T1
JOIN
(
SELECT
Recipient,
Status,
ROW_NUMBER() OVER (PARTITION BY Recipient ORDER BY Date Desc) AS rn
FROM Messages
) T2
ON T1.Recipient = T2.Recipient AND T2.rn = 1
得到以下结果:
Recipient EmailCount Status
others@example.com 2 2
someone@example.com 2 1
them@example.com 3 1