如何根据治疗费用找出前N名疾病?

时间:2015-03-18 17:35:09

标签: sql oracle oracle11g oracle-sqldeveloper data-warehouse

这是我到目前为止所尝试的

SELECT DISTINCT 
    RECORDS.TOTAL_COST, DISEASE.DISEASE_ID
FROM 
    RECORDS, DISEASE
WHERE 
    DISEASE.DISEASE_ID = RECORDS.DISEASE_ID 
    AND TREATMENT.TREATMENT_ID = RECORDS.TREATMENT_ID
GROUP BY 
    DISEASE.DISEASE_NAME

这是所提供数据的星型模式

Treatment

CREATE TABLE treatment
(
    treatment_id NUMBER(6),
    treatment_type VARCHAR2(30),
    private_cost NUMBER(8,2),
    public_cost NUMBER(8,2),
    description VARCHAR
)

创建记录事实表

CREATE TABLE records
(
    patient_id NUMBER(6),
    doctor_id NUMBER(6),
    disease_id NUMBER(6),
    treatment_id NUMBER(6),
    time_id DATE,
    side_effects NUMBER(1),
    effectivness NUMBER(1),
    total_cost NUMBER(8,2)
 );

为所有维度表创建外键

ALTER TABLE records
ADD ( CONSTRAINT records_patients_fk FOREIGN KEY (patient_id) REFERENCES patients,
 CONSTRAINT records_doctors_fk FOREIGN KEY (doctor_id) REFERENCES doctors,
 CONSTRAINT records_disease_fk FOREIGN KEY (disease_id) REFERENCES disease,
 CONSTRAINT records_treatment_fk FOREIGN KEY (treatment_id) REFERENCES treatment,
 CONSTRAINT records_times_fk FOREIGN KEY (time_id) REFERENCES times); 

CREATE TABLE disease
(
    disease_id NUMBER(6),
    disease_name VARCHAR2(30) 
);  

1 个答案:

答案 0 :(得分:0)

假设第一个查询中返回的数据大部分是正确的,除了只想要前N个项:

SELECT TOTAL_COST, DISEASE_ID
FROM
(
   SELECT DISTINCT RECORDS.TOTAL_COST, DISEASE.DISEASE_ID
   FROM RECORDS, DISEASE
   WHERE DISEASE.DISEASE_ID=RECORDS.DISEASE_ID AND
   TREATMENT.TREATMENT_ID=RECORDS.TREATMENT_ID
   GROUP BY DISEASE.DISEASE_NAME
   ORDER BY RECORDS.TOTAL_COST DESC
)
WHERE ROWNUM <= 5; -- replace 5 with however many you want.