oracle查询帮助

oracle查询帮助,oracle,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

我有以下资料:

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;
我正试图得到多少活动与已完成的项目存在每个不动产。根据上述数据:我应该有

2011年7月27日完成的一个项目和C号房地产的一个正在进行的项目。 两个于2011年8月29日和2011年6月27日完成的B号房地产项目。 一个于2011年7月29日完成的A区项目

我遇到的问题是,estate_no A对于同一个项目有两个日期,有4个不同的版本。他们将它标记为就绪,但意识到它实际上并没有就绪,做了更多的工作,然后再次将它标记为就绪

任何帮助都将不胜感激

  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

只要项目有一个就绪日期,这似乎就可以工作。

您应该为遗产和项目选择具有最大版本的行

一种方法是联接包含具有最大版本的行的子查询:

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