I have two tables:
CREATE TABLE fund_data
(
id serial NOT NULL,
fund_entries_id integer NOT NULL,
fund_val numeric(25,6) NOT NULL,
bbg_pulls_id integer NOT NULL,
CONSTRAINT fund_data_pkey PRIMARY KEY (id),
CONSTRAINT fund_data_bbg_pulls_id_fkey FOREIGN KEY (bbg_pulls_id)
REFERENCES bbg_pulls (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fund_data_fund_entries_id_fkey FOREIGN KEY (fund_entries_id)
REFERENCES fund_entries (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fund_data_fund_entries_id_bbg_pulls_id_key UNIQUE (fund_entries_id, bbg_pulls_id)
)
And:
CREATE TABLE fund_entries
(
id serial NOT NULL,
fiscal_prd_end_date date NOT NULL,
company_id integer NOT NULL,
ern_dt_id integer NOT NULL,
CONSTRAINT fund_entries_pkey PRIMARY KEY (id),
CONSTRAINT fund_entries_company_id_fkey FOREIGN KEY (company_id)
REFERENCES company (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fund_entries_ern_dt_id_fkey11 FOREIGN KEY (ern_dt_id)
REFERENCES ern_dt (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fund_entries_company_id_fiscal_prd_end_date_key UNIQUE (company_id, fiscal_prd_end_date),
CONSTRAINT fund_entries_ern_dt_id_key UNIQUE (ern_dt_id)
)
To get the most recent value from fund_data for a given company_id and bbg_pulls_id, I currently do two correlated sub-queries:
SELECT fd.fund_val
FROM fund_data fd
,(
SELECT fe.id
FROM fund_entries fe
,(
SELECT max(fe.fiscal_prd_end_date)
FROM fund_entries fe
WHERE fe.company_id = 858
) md
WHERE fe.fiscal_prd_end_date = md.max
AND fe.company_id = 858
) mi
WHERE fd.bbg_pulls_id = 20
AND fd.fund_entries_id = mi.id
Question: The query works find, but can I use windowing to avoid the two sub-queries? I've tried several times and I keep getting multiple rows.
EDIT: A description of the query in words: Find the max date for a given company_id, so I can find the id for that record. Then use that id to get the most recent value associated with that fk id (and max date) for a given bbg_pulls_id and company. Hopefully that helps.
md.max
in the above example?