2013-04-23 29 views
0

下面PostgreSQL的SELECT查詢總是返回結果的最後日期,因爲performance.query_plan表中有幾個條目和不同TIMESTAMP值:查找入口有一個從PostgreSQL表

SELECT * FROM 
    performance.query q, 
    performance.query_plan AS qp 
WHERE 
    q.idx = qp.queryidx 
    AND q.newplanneeded > qp.ts 
LIMIT 1; 

在這些數項在performance.query_plan表我只對最新的時間戳值(存儲在q.newplanneeded列中)感興趣。我怎樣才能在WHERE條件中表示qp.ts應該等於performance.query_plan表中最新增加的一行?

+0

您是在尋找最新的單個查詢計劃還是所有查詢過期計劃? – Quassnoi 2013-04-23 13:15:37

+0

最後一個計劃的單查詢 – 2013-04-23 13:19:35

+0

哪個查詢?那是最新的「新計劃」,那些時間差別最大的計劃是最少的(或最大的)計劃?如果您有兩個過期的查詢,您將如何選擇要返回哪一個? – Quassnoi 2013-04-23 13:21:36

回答

2
SELECT (q).*, (qp).* 
FROM (
     SELECT q, 
       (
       SELECT qp 
       FROM query_plan qp 
       WHERE qp.queryidx = q.idx 
       ORDER BY 
         ts DESC 
       LIMIT 1 
       ) qp 
     FROM query q 
     ) qv 
WHERE (q).newplanneeded > (qp).ts 
ORDER BY 
     (q).idx 
LIMIT 1 
2

您對您的查詢需要一個order by

select * from 
    performance.query q, 
    performance.query_plan qp 
WHERE 
    q.idx = qp.queryidx 
    AND q.newplanneeded < qp.ts 
order by ts desc 
limit 1; 

我只是翻了比較的方向。

如果全部都是ts且比q.newplanneeded舊,那麼查詢將不返回任何內容。

如果有些較舊,有些較新,則返回最新值。

+0

沒有成功,因爲它提供了一個較早的條目。我想要的是,如果最新條目比q.newplanneeded更舊,則不應退款; – 2013-04-23 13:18:09

+0

@ pr123。 。 。如果最新條目(由'ts')早於'q.newplanneeded',那麼查詢應該不返回任何行。由於where子句中的條件,結果集是空的。 – 2013-04-23 13:26:42

+1

@GordonLinoff:如果在'q'中有記錄的早期和晚期計劃,查詢將返回一條記錄。 – Quassnoi 2013-04-23 15:15:02

0
select distinct on (q.idx) * 
from 
    performance.query q, 
    performance.query_plan qp 
WHERE 
    q.idx = qp.queryidx 
order by q.idx, qp.ts desc