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