2013-06-03 31 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; –