在这种情况下,我发现使用分析窗口函数来完成所需的输出更容易。在我的查询中获得所需输出的关键是:
AVG(score) OVER (PARTITION BY quiznum, quizdate) AS avg_score
完成这项工作的查询如下。我正在使用 WITH 子句来创建虚假数据,但不要让您感到困惑。 BASE 查询是您所需要的。 WITH 子句只是在这里创建一个包含要处理的数据的假表。
WITH demo_data AS
(
SELECT 1001 AS quiznum, '10-JAN-18' AS quizdate, 91 AS score FROM dual UNION ALL
SELECT 1001 AS quiznum, '10-JAN-18' AS quizdate, 75 AS score FROM dual UNION ALL
SELECT 1001 AS quiznum, '10-JAN-18' AS quizdate, 35 AS score FROM dual UNION ALL
SELECT 1001 AS quiznum, '10-JAN-18' AS quizdate, 40 AS score FROM dual UNION ALL
SELECT 1001 AS quiznum, '10-JAN-18' AS quizdate, 70 AS score FROM dual UNION ALL
SELECT 1001 AS quiznum, '10-JAN-18' AS quizdate, 85 AS score FROM dual UNION ALL
SELECT 1002 AS quiznum, '17-JAN-18' AS quizdate, 35 AS score FROM dual UNION ALL
SELECT 1002 AS quiznum, '17-JAN-18' AS quizdate, 40 AS score FROM dual UNION ALL
SELECT 1002 AS quiznum, '17-JAN-18' AS quizdate, 70 AS score FROM dual UNION ALL
SELECT 1002 AS quiznum, '17-JAN-18' AS quizdate, 85 AS score FROM dual
)
SELECT quiznum, quizdate, score, avg_score
FROM
(
SELECT quiznum, quizdate, score, AVG(score) OVER (PARTITION BY quiznum, quizdate) AS avg_score
FROM demo_data
)
WHERE score < avg_score
;
下图按测验编号和日期显示了所有数据,并告诉我们平均分数。我们可以通过用外部 Select 包装它来使用它,这样我们就可以在 WHERE 子句中添加一个过滤器,以便将分数与平均分数进行比较。
下图显示了在 WHERE 子句中添加过滤器后的样子: