2013-06-03 1 views
-1

에서 procedure_fk 필터 포스트 그레스의 최신 버전으로 업데이트 날짜 오래된 버전의 날짜를 찾는 방법 사전이 내가 procedure_fk 필터</p> <p>할 수있는 하나 포스트 그레스에 날짜가 최신 버전을 업데이트 날짜 오래된 버전을 찾을 수 있어야 내 테이블입니다 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

어느 한 내가 procedure_runtime_information 테이블에 주어진 procedure_fk에 대한 updated_datetime 최신 버전 가장 오래된 버전 업데이트 날짜를 찾을 필요가 저에게 –

+0

도움을 줄 수 –

+0

할 수있는 모든 일 개에 도움이 –

답변

1

나는 완전히 당신이 뭘 하려는지 이해하지 못하는 나에게 덕분에 도움이되지만 당신의 관계는 나에게 분명 완료되지 않습니다. 그러나 min 및 max를 기준으로 필터링 할 수 있어야합니다. 예를 들어, 다음과 같은했다 :

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

선택 *에서 ( 선택 최대 (h.updated_datetime) 보고서 r, report_history h, procedure_runtime_information PRI, min에서 min (h.updated_datetime) min, as h.report_fk = r.pk 및 r.study_fk = S.pk 및 PRI.pk = S입니다. procedure_runtime_fk 및 추출 ((max (h.updated_datetime) - 분 (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) 결과 1; –