0
我在Postgres中有一個名爲calendar
的表,我試圖查詢第一個存儲年份= 2013的日期值。PostgreSQL查詢日期年齡最老的地方
我已經寫了下面的查詢哪些工作,但我想知道如果我可以查詢第一個日期,而不是隻獲取所有數據,並只限於一個?
SELECT date FROM calendar WHERE year=2013 ORDER BY date ASC LIMIT 1
我在Postgres中有一個名爲calendar
的表,我試圖查詢第一個存儲年份= 2013的日期值。PostgreSQL查詢日期年齡最老的地方
我已經寫了下面的查詢哪些工作,但我想知道如果我可以查詢第一個日期,而不是隻獲取所有數據,並只限於一個?
SELECT date FROM calendar WHERE year=2013 ORDER BY date ASC LIMIT 1
-- 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)
你有沒有試過只是這樣的事情?
情況下,如果你有一個年字段:
select MIN(date)
from calendar
where year = 2013
情況下,如果你還沒有一年場:
select MIN(date)
from calendar
where date >= '01-01-2013'
如果您對'date'列的索引(其中順便說一句。對於一個專欄來說是一個可怕的名字),那麼Postgres將*不*獲得所有的數據。你可以做一些事情,比如'where date =(從日曆中選擇max(date))',但那不會更有效率。 –
表格結構如何?我看到你正在使用'where year = 2013',所以我假設你沒有使用時間戳或日期列? –
你有「日期」和「年」欄 - 哇?!奇怪的模式。提示:在這裏發佈問題時,顯示您的模式(CREATE TABLE語句),最好是一些示例數據。你的PostgreSQL版本也應該在每一個問題中。 –