【问题标题】:Using Oracle SQL to join duplicate counts to an existing subquery使用 Oracle SQL 将重复计数连接到现有子查询
【发布时间】:2020-05-20 08:22:11
【问题描述】:

我被要求构建一个查询,对某个状态测试的数据运行质量检查。

我有以下查询,它创建一个名为“标志”的变量来识别存在问题的情况。主查询实际上是在子查询中,我只选择 Flag 有值的情况,过滤掉所有没有标志的记录。

我希望能够为存在重复测试的情况提供一个 CASE WHEN。我们确实有一些重复项,对于相同的学生 ID(test.studentID、studenttestscore.studentID、students.ID),学生在同一考试中的考试日期相同。

如您所见,测试日期是 STUDENTTEST.TEST_DATE。可以通过 STUDENTTEST.ID 或 TEST.NAME 识别考试。对于 STUDENTTEST.studentID,查找 STUDENTTEST.test_date 和 STUDENTTEST.ID 相同的记录可能更容易。但是,一旦您获得了该计数,就必须将其附加到此处的子查询中,以便我们可以将学生姓名与之关联。

with query as (select STUDENTS.STUDENT_NUMBER as "Student ID", Students.Lastfirst as "Student Name",
    STUDENTS.GRADE_LEVEL as "Current Grade Level",
    TEST.NAME as "Test Name",
    STUDENTTEST.GRADE_LEVEL as "Grade level at time of exam",
    STUDENTTEST.TEST_DATE as TEST_DATE,
    STUDENTTESTSCORE.NUMSCORE as Score, STUDENTTESTSCORE.PERCENTSCORE as PCTScore,
S_NY_STU_X.DATEOFENTRYGRade9 as Cohort,
CASE
WHEN STUDENTTEST.GRADE_LEVEL <9 or STUDENTTEST.GRADE_LEVEL>12 then 'Invalid Grade Level'
WHEN STUDENTTESTSCORE.NUMSCORE != STUDENTTESTSCORE.PERCENTSCORE then 'Mismatch between number and percent score'
WHEN TEST.NAME like '% - T%' then 'Transitional Global no longer administered'
WHEN STUDENTTEST.TEST_DATE>CURRENT_DATE THEN 'Test date invalid'
WHEN STUDENTTESTSCORE.NUMSCORE <0 THEN 'Test score out of range'
WHEN STUDENTTESTSCORE.NUMSCORE <0 THEN 'Test score out of range'
WHEN STUDENTTESTSCORE.NUMSCORE >100  THEN 'Test score out of range'
WHEN STUDENTTESTSCORE.PERCENTSCORE > 100 THEN 'Test score out of range'
END AS Flag
 from STUDENTS STUDENTS,
    STUDENTTEST STUDENTTEST,
    STUDENTTESTSCORE STUDENTTESTSCORE,
    TEST TEST,
    TESTSCORE TESTSCORE,
    S_NY_STU_X S_NY_STU_X

 where 
 Test.Name like 'Regents%' and
 STUDENTTESTSCORE.TESTSCOREID=TESTSCORE.ID
    and STUDENTTESTSCORE.STUDENTTESTID=STUDENTTEST.ID
    and STUDENTTESTSCORE.STUDENTID=STUDENTTEST.STUDENTID
    and STUDENTS.ID=STUDENTTEST.STUDENTID
    and STUDENTS.ID=STUDENTTESTSCORE.STUDENTID
    and STUDENTTEST.TESTID=TEST.ID
and S_NY_STU_X.STUDENTSDCID=STUDENTS.DCID)
select * from query where flag is not null 

非常感谢!!

【问题讨论】:

  • 今日提示:始终使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),如果需要更容易转换为外连接

标签: sql oracle oracle11g oracle-apex


【解决方案1】:

据我了解,您可以将此分析 count() 添加到您的 case

when count(1) over (partition by studenttest.test_date, 
                                 studenttest.id, 
                                 studenttest.studentid) > 1 
then 'duplicate'

示例如下:

with t (test_date, test_id, student_id) as (
    select date '2013-05-18', 707, 20214 from dual union all
    select date '2013-05-18', 707, 20214 from dual union all
    select date '2013-05-12', 707, 20214 from dual union all
    select date '2023-05-18', 707,  1003 from dual union all
    select date '2013-05-02', 705,  1003 from dual )
select t.*, 
       case 
            when test_date > current_date 
            then 'Test date invalid'
            when count(1) over (partition by test_date, test_id, student_id) > 1 
            then 'duplicated test' 
       end as flag
  from t

结果:

TEST_DATE      TEST_ID STUDENT_ID FLAG
----------- ---------- ---------- -----------------
2013-05-02         705       1003 
2013-05-12         707      20214 
2013-05-18         707      20214 duplicated test
2013-05-18         707      20214 duplicated test
2023-05-18         707       1003 Test date invalid

【讨论】:

  • 工作就像一个魅力!非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2016-07-18
相关资源
最近更新 更多