我仍然不太熟悉PostgreSQL,但理解你不能在WHERE子句中使用聚合函数。
我的数据如下:
dID | status | created_at
---------------------------
2 | 2 | 2014-01-01
2 | 2 | 2014-02-01
3 | 2 | 2013-12-22
我实际上是在尝试构建一个查询,该查询将根据最小的created_at日期返回数据集中的所有结果。以下查询不起作用,但它确实突出了我正在努力实现的目标:
select
*
from table1 a
JOIN table2 b ON (a.id = b.id)
where a.did = 2
AND b.status = 2
AND MIN(b.created_at) < '2014-01-31'
上面的示例表是从一个非常大的数据集聚合而来的,但我基本上想找到一个dID列表,这些dID具有某个特定状态,其中created_at日期是在某个特定时间段定义的。有什么建议吗?
答案 0 :(得分:1)
也许:
postgres=# SELECT DISTINCT ON (id, status) *
FROM table1
WHERE id = 2 and status = 2 and created_at < '2014-01-31'
ORDER BY id, status, created_at;
id | status | created_at
----+--------+------------
2 | 2 | 2014-01-01
(1 row)
答案 1 :(得分:1)
我认为你只想要HAVING
条款,但很难确定你的问题:
select did
from t
group by did
having min(created_at) < '2014-01-31';
如果您想从另一个表中获取数据,您是否可以使用EXISTS
子查询,尽管可能存在性能问题:
SELECT *
FROM t1
WHERE EXISTS (
SELECT 1
FROM t2
WHERE t1.did = t2.did
GROUP BY t2.did
HAVING min(t2.created_at) < '2014-01-31'
);
...或者您可以加入一个返回符合条件的DID集的查询。