2012-04-11 46 views
0

编辑:解决了很多来自Dems的帮助,我将发布截断版本的查询,现在工作得非常好!ORACLE SQL返回最近添加的记录详细信息

  SELECT 
    * 

FROM 

    O_PERSONS 

    /*The below left join returns the most recently added ethnicity classification*/ 
    LEFT JOIN 

    (SELECT 
    ROW_NUMBER() OVER (PARTITION BY O_CLASSIFICATIONS.CLA_SUBJECT_ID ORDER BY O_CLASSIFICATIONS.CLA_DATE_NOTIFIED DESC) AS Sequence_ID, 
    O_CLASSIFICATIONS.CLA_CAT_ID, 
    O_CLASSIFICATIONS.CLA_SUBJECT_ID 
    FROM 
    O_CLASSIFICATIONS 
    WHERE 
    O_CLASSIFICATIONS.CLA_SUBJECT_IND = 'P' 
    AND 
    O_CLASSIFICATIONS.CLA_TOP_CAT_ID = 'ETHNIC' 
    AND 
    O_CLASSIFICATIONS.CLA_CAT_ID <> 'DECLINED' 
    ) ETHNIC 
    ON ETHNIC.CLA_SUBJECT_ID = O_PERSONS.PER_ID 
    AND ETHNIC.Sequence_ID = 1 

    /*The below left join returns the most recently added PCG classification*/ 
    LEFT JOIN 

    (SELECT 
    ROW_NUMBER() OVER (PARTITION BY O_CLASSIFICATIONS.CLA_SUBJECT_ID ORDER BY O_CLASSIFICATIONS.CLA_DATE_NOTIFIED DESC) AS Sequence_ID, 
    O_CLASSIFICATIONS.CLA_CAT_ID, 
    O_CLASSIFICATIONS.CLA_SUBJECT_ID 
    FROM 
    O_CLASSIFICATIONS 
    WHERE 
    O_CLASSIFICATIONS.CLA_SUBJECT_IND = 'P' 
    AND 
    O_CLASSIFICATIONS.CLA_TOP_CAT_ID = 'PRIMARY' 
    AND 
    O_CLASSIFICATIONS.CLA_CAT_ID <> 'DECLINED' 
    ) PCG 
    ON PCG.CLA_SUBJECT_ID = O_PERSONS.PER_ID 
    AND PCG.Sequence_ID = 1 


    WHERE 

    O_PERSONS.PER_ID LIKE 'P%' 

我目前正在尝试编写一个查询,该查询将为我们的系统上的客户端返回某些详细信息。虽然客户只有一个出生日期,性别和身份证,但他们可能有多个种族(由于数据质量)以及客户群(由于客户需求可能会发生变化,因此更合理)。但是,对于这些特定项目,我只对最近添加的种族或客户群体感兴趣。在下面,我写了一个查询,为种族和客户群分配一个行号,计划只返回等于1的那些,因为这些通常是最新的。但是,我遇到了两个问题,其中一个我可以解决,另一个我不太确定。

首先,一些客户不会记录种族或客户群。当运行下面的查询时,它们返回非常奇怪的行号(通常为数千)。但是,我知道在哪里可以指定如果客户群或种族为空(因为这些数据质量案例需要解决),那么会返回一行。

第二个问题稍微有点棘手,我将尝试用下面的表格来表示。请注意我简化了表格以便于输入和理解。

P ID Ethnicity PCG RN E RN P 
    P1 WB   OV 1 2 
    P1 WI   OV 2 1   

上面的客户有两个种族,尽管WB是最近的(因此行号E中的1是正确的)。但是,客户端只记录了一个PCG,但行号在第一行(可以说是我想返回的行)返回2。我不知道为什么我猜测,因为ETHNIC.CLA_SUBJECT_ID在O_PERSONS.PER_ID上连接,并且PER_ID出现两次,这就是为什么它认为该特定字段有两行。然而,即使是这样,是否有办法迫使1出现在一行中呢?或者我可以以完全不同的方式做到这一点?希望这个查询是有道理的,如果部分不清楚,我们会道歉。谢谢,

      SELECT 
      O_PERSONS.PER_ID as "P ID", 
      olm_bo.get_per_name(O_PERSONS.PER_ID) as "Full Name", 
      O_PERSONS.PER_BIRTH_DATE as "Date of Birth", 
      case 
      when O_PERSONS.PER_DECEASED_DATE is null then FLOOR(MONTHS_BETWEEN(sysdate,O_PERSONS.PER_BIRTH_DATE)/12) 
      else FLOOR(MONTHS_BETWEEN(O_PERSONS.PER_DECEASED_DATE,O_PERSONS.PER_BIRTH_DATE)/12) 
      end as "Age", 
      O_PERSONS.PER_DECEASED_DATE as "Date Deceased", 
      olm_bo.get_gender_desc('P', O_PERSONS.PER_GENDER) as "Gender", 
      CASE 
      WHEN ETHNIC.CLA_CAT_ID IN ('C1','C2','C3','C4','ABAN','AIND','AOTH','APKN') THEN 'Asian or Asian British' 
      ELSE NULL 
      End as "Ethnicity - Top" , 
      CASE 
      WHEN ETHNIC.CLA_CAT_ID IN ('BAFR','D2') THEN 'African' 
      ELSE NULL 
      End as "Ethnicity - Detail" , 
      CASE 
      WHEN PCG.CLA_CAT_ID IN ('ASYLUM','REFUGEE') THEN 'Asylum Seeker/Refugee' 
      ELSE NULL 
      End as "PCG", 
      CASE 
      WHEN PCG.CLA_CAT_ID IN ('ASYLUM','REFUGEE') THEN 'Asylum Seeker/Refugee' 
      ELSE NULL 
      End as "PCG - Top", 
      CASE 
      WHEN PCG.CLA_CAT_ID IN ('ASYLUM','REFUGEE') THEN 'Asylum Seeker/Refugee' 
      ELSE NULL 
      End as "PCG - DETAIL", 

      to_char(row_number() over(PARTITION BY ETHNIC.CLA_SUBJECT_ID ORDER BY abs(sysdate - ETHNIC.CLA_DATE_NOTIFIED) asc)) as "Row Number E", 
      to_char(row_number() over(PARTITION BY PCG.CLA_SUBJECT_ID ORDER BY abs(sysdate - PCG.CLA_DATE_NOTIFIED) asc))as "Row Number P" 

     FROM 

      O_PERSONS 

      LEFT JOIN O_CLASSIFICATIONS ETHNIC ON ETHNIC.CLA_SUBJECT_ID = O_PERSONS.PER_ID 
      AND ETHNIC.CLA_SUBJECT_IND = 'P' 
      AND ETHNIC.CLA_TOP_CAT_ID = 'ETHNIC' 
      AND ETHNIC.CLA_CAT_ID <> 'DECLINED' 

      LEFT JOIN O_CLASSIFICATIONS PCG ON PCG.CLA_SUBJECT_ID = O_PERSONS.PER_ID 
      AND PCG.CLA_SUBJECT_IND = 'P' 
      AND PCG.CLA_TOP_CAT_ID = 'PRIMARY' 
      AND PCG.CLA_CAT_ID <> 'DECLINED' 

      WHERE 
      /*Following line excludes any clients whose is less than 18)*/ 
      O_PERSONS.PER_BIRTH_DATE > trunc(add_months(O_PERSONS.PER_BIRTH_DATE,-216)) 
      AND O_PERSONS.PER_ID LIKE 'P%' 

回答

1

您应该应用你做的加入前ROW_NUMBER()

SELECT 
    *  -- Your calculations here, '*' used for brevity 
FROM 
    O_PERSONS 
LEFT JOIN 
(
    SELECT 
    ROW_NUMBER() OVER (PARTITION BY CLA_SUBJECT_ID ORDER BY CLA_DATE_NOTIFIED DESC) AS sequence_id, 
    * 
    FROM 
    O_CLASSIFICATIONS 
    WHERE 
     CLA_SUBJECT_IND = 'P' 
    AND CLA_TOP_CAT_ID = 'ETHNIC' 
    AND CLA_CAT_ID  <> 'DECLINED' 
) 
    ETHNIC 
    ON ETHNIC.CLA_SUBJECT_ID = O_PERSONS.PER_ID 
    AND ETHNIC.sequence_id = 1 
LEFT JOIN 
(
    SELECT 
    ROW_NUMBER() OVER (PARTITION BY CLA_SUBJECT_ID ORDER BY CLA_DATE_NOTIFIED DESC) AS sequence_id, 
    * 
    FROM 
    O_CLASSIFICATIONS 
    WHERE 
     CLA_SUBJECT_IND = 'P' 
    AND CLA_TOP_CAT_ID = 'PRIMARY' 
    AND CLA_CAT_ID  <> 'DECLINED' 
) 
    PCG 
    ON PCG.CLA_SUBJECT_ID = O_PERSONS.PER_ID 
    AND PCG.sequence_id = 1 
WHERE 
    /*Following line excludes any clients whose is less than 18)*/ 
    O_PERSONS.PER_BIRTH_DATE > trunc(add_months(O_PERSONS.PER_BIRTH_DATE,-216)) 
AND O_PERSONS.PER_ID LIKE 'P%' 
+0

好了,这似乎是有道理的,但是,我已经试过运行没有成功,下面的查询(规定存在缺失的右括号?)这件事情做的加入为查询运行与任命为我上面展示,但不是当我试图让他们按照你的建议 - 我会发布我上面尝试的代码。 – bawpie 2012-04-11 14:05:42

+0

@bawpie - 你在哪里别名子查询,你有一个错误。 ')O_CLASSIFICATIONS ETHNIC'应该是')ETHNIC'。对于'PCG'子查询也是一样的。 – MatBailie 2012-04-11 14:10:03

+0

对不起,我居然尝试过),ETHNIC仍然收到同样的错误?我将发布查询,因为我目前正试图运行它来说明。谢谢! – bawpie 2012-04-11 14:21:35

相关问题