2014-01-18 57 views
0

我在Postgres中有一個名爲calendar的表,我試圖查詢第一個存儲年份= 2013的日期值。PostgreSQL查詢日期年齡最老的地方

我已經寫了下面的查詢哪些工作,但我想知道如果我可以查詢第一個日期,而不是隻獲取所有數據,並只限於一個?

SELECT date FROM calendar WHERE year=2013 ORDER BY date ASC LIMIT 1 
+3

如果您對'date'列的索引(其中順便說一句。對於一個專欄來說是一個可怕的名字),那麼Postgres將*不*獲得所有的數據。你可以做一些事情,比如'where date =(從日曆中選擇max(date))',但那不會更有效率。 –

+4

表格結構如何?我看到你正在使用'where year = 2013',所以我假設你沒有使用時間戳或日期列? –

+0

你有「日期」和「年」欄 - 哇?!奇怪的模式。提示:在這裏發佈問題時,顯示您的模式(CREATE TABLE語句),最好是一些示例數據。你的PostgreSQL版本也應該在每一個問題中。 –

回答

2
 -- the schema 
DROP SCHEMA lutser CASCADE; 
CREATE SCHEMA lutser; 
SET search_path='lutser'; 

     -- the table 
CREATE TABLE years 
    (zdate DATE NOT NULL PRIMARY KEY 
    -- omitting a separate "year" field 
    -- , since it can be derived from a date. 
    -- ... ... 
); 
     -- the data 
INSERT INTO years(zdate) 
SELECT gs 
FROM generate_series('2012-1-1' , '2014-12-31', '7 days'::interval) gs 
     ; 

     -- the query 
SELECT zdate 
FROM years yy 
WHERE date_trunc('year' , yy.zdate) = '2014-01-01'::date 
AND NOT EXISTS (
     SELECT * 
     FROM years nx 
     WHERE date_trunc('year' , nx.zdate) = '2014-01-01'::date 
     AND nx.zdate < yy.zdate 
     ) 
     ; 

     -- the same query using a CTE 
WITH this AS (
     SELECT zdate 
     FROM years yy 
     WHERE date_trunc('year' , yy.zdate) = '2014-01-01'::date 
     ) 
SELECT th.zdate 
FROM this th 
WHERE NOT EXISTS (
     SELECT * 
     FROM this nx 
     WHERE nx.zdate < th.zdate 
     ) 
     ; 


\q 
     -- the result 
DROP SCHEMA 
CREATE SCHEMA 
SET 
CREATE TABLE 
INSERT 0 157 
    zdate 
------------ 
2014-01-05 
(1 row) 
0

你有沒有試過只是這樣的事情?

情況下,如果你有一個年字段:

select MIN(date) 
from calendar 
where year = 2013 

情況下,如果你還沒有一年場:

select MIN(date) 
from calendar 
where date >= '01-01-2013'