2013-06-03 68 views
-1

的最新版本更新日期時間和歷史最悠久的修改日期時間與procedure_fk過濾器的Postgres這是我的表,我應該找到的最新版本更新日期時間和最古老的版本日期時間Postgres裏有procedure_fk過濾如何找到PostgreSQL的

任何一個可以幫我 在此先感謝

CREATE TABLE "study" (
"pk" SERIAL PRIMARY KEY, 
"procedure_runtime_fk" BIGINT, 
"patient_fk" BIGINT, 
"modality_infra_fk" BIGINT, 
"priority_fk" BIGINT, 
"status_fk" BIGINT, 
"pacs_server_fk" BIGINT, 
"study_iuid" VARCHAR(1024) UNIQUE, 
"study_datetime" TIMESTAMP, 
"accession_no" VARCHAR(128), 
"study_desc" TEXT, 
"mods_in_study" TEXT, 
"num_series" BIGINT, 
"num_instances" BIGINT, 
"availibility" VARCHAR(32), 
"ref_physician" VARCHAR(255), 
"create_datetime" TIMESTAMP, 
"childs" TEXT 
); 

CREATE TABLE "procedure_runtime_information" (
"pk" SERIAL PRIMARY KEY, 
"patient_fk" BIGINT, 
"patient_visit_fk" BIGINT, 
"procedure_fk" BIGINT, 
"procedure_performed_datetime" TIMESTAMP, 
"author_fk" BIGINT, 
"creation_datetime" TIMESTAMP, 
"procedure_actual_duration" BIGINT, 
"procedure_indications" TEXT DEFAULT NULL, 
"pre_procedure_info" TEXT DEFAULT NULL, 
"procedure_description" TEXT DEFAULT NULL, 
"procedure_exposure" TEXT DEFAULT NULL, 
"procedure_skindose" TEXT DEFAULT NULL, 
"ref_phys_fk" BIGINT DEFAULT NULL, 
"object_type" BIGINT DEFAULT NULL, 
"priority_fk" BIGINT DEFAULT NULL, 
"procedure_id" VARCHAR(256) DEFAULT NULL, 
"patient_arrival_datetime" TIMESTAMP, 
"procedure_start_datetime" TIMESTAMP 

); 


CREATE TABLE "report_history" (
"pk" SERIAL PRIMARY KEY, 
"revision" BIGINT, 
"report_fk" BIGINT, 
"old_status_fk" BIGINT, 
"updatedby_fk" BIGINT, 
"updated_datetime" TIMESTAMP, 
"file_path" TEXT, 
"synopsis" TEXT 
); 



CREATE TABLE "report" (
"pk" SERIAL PRIMARY KEY, 
"report_uuid" VARCHAR(32) UNIQUE, 
"study_fk" BIGINT, 
"status_fk" BIGINT, 
"priority_fk" BIGINT, 
"report_relative_path" VARCHAR(256), 
"report_type_fk" BIGINT, 
"createdby_fk" BIGINT, 
"created_datetime" TIMESTAMP 
); 
+0

任何一個可以幫助我 –

+0

我需要找到updated_datetime的最新版本和最古老的版本更新日期時間爲procedure_runtime_information表給定procedure_fk –

+0

任何一個可以幫助這個 –

回答

1

我不完全理解你正在嘗試做的,但你的關係不明確完成我。但是,您應該能夠根據最小值和最大值進行過濾。例如,如果你有以下幾點:

Create table foo(
id serial, 
foo_detail text); 

create table foo_history 
(id serial, 
foo_id int references foo(id), 
some_new_info text, 
modified timestamp with time zone NOT NULL DEFAULT now() 
); 

create index idx_foo_history_modified on foo_history using btree (modified) 

(select * from foo f 
inner join foo_history fh on (fh.foo_id = f.id) 
where f.id = 3 
order by fh.modified asc 
limit 1) 
UNION ALL 
(select * from foo f 
inner join foo_history fh on (fh.foo_id = f.id) 
where f.id = 3 
order by fh.modified desc 
limit 1); 

你也可以使用子查詢做到這一點,像下面,但我相信聯盟會更有效率。

select * from foo f 
inner join foo_history fh on (fh.foo_id = f.id) 
where f.id = 3 
and fh.id = (select max(id) from foo_history where foo_id = 3) 
or fh.id = (select min(id) from foo_history where foo_id = 3); 

希望這會有所幫助。順便說一下,你應該包括你正在使用的Postgresql版本。我使用9.1,這個答案是從我的經驗中發展而來的。

+0

SELECT * FROM( 選擇MAX(h.updated_datetime)從報告r,報告歷史h,過程運行時間信息PRI,研究S最大,最小(h.updated_datetime),研究S 其中 h.report_fk = r.pk和 r.study_fk = S.pk和 PRI.pk = S。 procedure_runtime_fk和 摘錄(來自(max(h.updated_datetime) - min(h.updated_datetime))的時期)<= 900和 h.pk IN( 從中選擇pk(select * from report_history where report_fk = r.pk)作爲結果 )和r.status_fk = 21 group by r.pk)作爲result1; –