昨天第一次看到的 Postgres select 记录
Postgres select records first seen yesterday
我正在尝试 select 所有在最后一天首次看到的记录以及一些其他聚合,但我无法弄清楚,因为 where 子句中不允许聚合。
这是我的尝试:
SELECT m.m_id,
m,
SUM(count) AS e_count,
COUNT(DISTINCT(c_code)) AS c_count
FROM e
LEFT JOIN m ON e.m_id = m.m_id
WHERE MIN(e_t::date) = current_date - INTERVAL '1' day
GROUP BY 1
ORDER BY 3 DESC;
我也尝试过使用子查询,但没有成功。任何想法如何做到这一点?
您只需要将逻辑放在 HAVING
子句中:
SELECT m.m_id, m, SUM(count) AS e_count,
COUNT(DISTINCT(c_code)) AS c_count
FROM e LEFT JOIN
m
ON e.m_id = m.m_id
GROUP BY 1
HAVING MIN(e_t::date) = current_date - INTERVAL '1' day
ORDER BY 3 DESC;
但是,您可能会发现在聚合之前过滤效率更高。您可以使用 WHERE
子句和 NOT EXISTS
:
SELECT m.m_id, m, SUM(count) AS e_count,
COUNT(DISTINCT(c_code)) AS c_count
FROM e LEFT JOIN
m
ON e.m_id = m.m_id
WHERE NOT EXISTS (SELECT 1
FROM e e2
WHERE e2.m_id = e.m_id AND
e_t::date < current_date - INTERVAL '1' day
)
GROUP BY 1
ORDER BY 3 DESC;
我正在尝试 select 所有在最后一天首次看到的记录以及一些其他聚合,但我无法弄清楚,因为 where 子句中不允许聚合。
这是我的尝试:
SELECT m.m_id,
m,
SUM(count) AS e_count,
COUNT(DISTINCT(c_code)) AS c_count
FROM e
LEFT JOIN m ON e.m_id = m.m_id
WHERE MIN(e_t::date) = current_date - INTERVAL '1' day
GROUP BY 1
ORDER BY 3 DESC;
我也尝试过使用子查询,但没有成功。任何想法如何做到这一点?
您只需要将逻辑放在 HAVING
子句中:
SELECT m.m_id, m, SUM(count) AS e_count,
COUNT(DISTINCT(c_code)) AS c_count
FROM e LEFT JOIN
m
ON e.m_id = m.m_id
GROUP BY 1
HAVING MIN(e_t::date) = current_date - INTERVAL '1' day
ORDER BY 3 DESC;
但是,您可能会发现在聚合之前过滤效率更高。您可以使用 WHERE
子句和 NOT EXISTS
:
SELECT m.m_id, m, SUM(count) AS e_count,
COUNT(DISTINCT(c_code)) AS c_count
FROM e LEFT JOIN
m
ON e.m_id = m.m_id
WHERE NOT EXISTS (SELECT 1
FROM e e2
WHERE e2.m_id = e.m_id AND
e_t::date < current_date - INTERVAL '1' day
)
GROUP BY 1
ORDER BY 3 DESC;