2011-09-08 67 views
0

,我有以下幾點:Oracle查詢幫助

CREATE TABLE R_TEST 
(
    PROJECT_ID NUMBER, 
    VERSION  NUMBER, 
    READY_DATE DATE, 
    ESTATE_NO VARCHAR2(1 BYTE) 
) 
    TABLESPACE vvvvvvvvv 
    PCTUSED 0 
    PCTFREE 10 
    INITRANS 1 
    MAXTRANS 255 
    STORAGE (
     INITIAL   64K 
     NEXT    1M 
     MINEXTENTS  1 
     MAXEXTENTS  UNLIMITED 
     PCTINCREASE  0 
     BUFFER_POOL  DEFAULT 
     ) 
LOGGING 
NOCOMPRESS 
NOCACHE 
NOPARALLEL 
MONITORING; 
SET DEFINE OFF; 

Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
Values 
    (1345, 1, NULL, 'a'); 
Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
Values 
    (1345, 2, NULL, 'a'); 
Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
Values 
    (1345, 3, TO_DATE('07/01/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'a'); 
Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
Values 
    (1345, 4, TO_DATE('07/29/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'a'); 
Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
    Values 
    (1059, 1, NULL, 'b'); 
Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
    Values 
    (1059, 2, TO_DATE('06/27/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'b'); 
    Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
Values 
    (2326, 1, NULL, 'b'); 
Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
    Values 
    (2326, 2, NULL, 'b'); 
Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
Values 
    (2326, 3, TO_DATE('08/29/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'b'); 
Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
Values 
    (998, 1, NULL, 'c'); 
    Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
    Values 
    (998, 2, TO_DATE('07/27/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 'c'); 
    Insert into R_TEST 
    (PROJECT_ID, VERSION, READY_DATE, ESTATE_NO) 
    Values 
    (998, 1, NULL, 'c'); 
    COMMIT; 

我想獲得多少活躍VS完成的項目每estate_no存在。根據以上數據:我應該有

一個完成的項目在2011年7月27日,一個活躍的項目在2011年8月29日和6/27/2011爲estate_no B. estate_no C. 兩個已完成項目一個已完成的項目於2011年7月29日的estate_no A.

我遇到的問題是,estate_no A對於同一個project_id有四個不同的版本有兩個日期。他們準備好了,但意識到它並沒有準備好,做了一些更多的工作,然後再準備一次。

任何幫助將不勝感激。

回答

1

您應該選擇具有版本和項目最大版本的行。

的一種方法是加入一個子查詢具有最大版本方含行:

SELECT r_test.project_id, r_test.version, r_test.ready_date, r_test.estate_no 
FROM r_test INNER JOIN (SELECT project_id, estate_no, max(version) as max_version 
         FROM r_test 
         GROUP BY project_id,estate_no 
         ) sub_r_test 
ON (r_test.project_id = sub_r_test.project_id 
    and r_test.estate_no = sub_r_test.estate_no 
    and r_test.version = sub_r_test.max_version 
    ) 

另一種方式是使用Oracle分析功能根據其基團,其中該基團在分選,得到在每一行上的行號然後選取具有數字1的線(它們將是最大版本的線)

SELECT project_id, version, ready_date, estate_no 
FROM (SELECT project_id, 
     version, 
     ready_date, 
     estate_no, 
     row_number() over (partition by project_id,estate_no order by version desc) rn 
     FROM r_test 
    ) 
WHERE rn=1 
0
select project_id, ready_date, version 
    from r_test r 
    where r.estate_no = 'c' 
    and ready_date is not null 
    and r.version = (select max(r2.version) from r_test r2 where r.project_id = r2.project_id) 
    group by project_id, version, estate_no, ready_date 

只要項目有一個準備好的日期,這似乎工作。