2014-02-26 44 views
0

我對PostgreSQL仍然不太熟悉,但明白在WHERE子句中不能使用聚合函數。如何根據PostgreSQL中的最短日期獲取結果

我有一個看起來像這樣的數據:

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' 

樣品臺以上是從一個非常大的數據集聚合,但我基本上要找到確實的是有一個列表特定狀態,其中created_at日期是在特定時間段定義的。有什麼建議麼?

+0

應該結束的最小值是多少?整個桌子,或所有具有相同ID,或相同的「做」,或其他東西? – jjanes

+0

@jjanes - 基本上,客戶可以擁有「多個」激活的狀態和日期。我想第一次找到當前仍處於活動狀態的客戶已激活 – JM4

回答

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) 
+0

我在此處收到GROUP BY問題的錯誤: 錯誤:列「a.id」必須出現在GROUP BY子句中或用於彙總功能 線路3:* – JM4

+0

帕維爾 - 謝謝,但不能走那條路。投入WHERE子句可以消除所需的所有結果。我很感謝幫助 - 我將在我的結尾修改以調整 – JM4

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集合的查詢。

相關問題