如何根据PostgreSQL中的最小日期提取结果

时间:2014-02-26 16:59:15

标签: database postgresql

我仍然不太熟悉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日期是在某个特定时间段定义的。有什么建议吗?

2 个答案:

答案 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集的查询。