0

我正在尝试列出教过 Java 课程最多的讲师所讲授的 Java 课程的讲师。

首先我选择教Java课程的讲师

SELECT z.FIRST_NAME,z.LAST_NAME,b.COURSE_NO, MAX(b.DESCRIPTION) AS DESCRIPTION
FROM INSTRUCTOR z
JOIN SECTION w ON z.INSTRUCTOR_ID = w.INSTRUCTOR_ID
JOIN COURSE b ON w.COURSE_NO = b.COURSE_NO
WHERE DESCRIPTION like '%Java%'
GROUP BY z.FIRST_NAME,z.LAST_NAME,b.COURSE_NO

它显示了到目前为止我想要的结果

FIRST_NAME                LAST_NAME                  COURSE_NO DESCRIPTION                                      
 ------------------------- ------------------------- ---------- ---------------------------------
Tom                       Wojick                           120 Intro to Java Programming                          
Gary                      Pertez                           120 Intro to Java Programming                          
Anita                     Morris                           124 Advanced Java Programming                          
Todd                      Smythe                           122 Intermediate Java Programming                      
Charles                   Lowry                            122 Intermediate Java Programming                      
Charles                   Lowry                            120 Intro to Java Programming                          
Fernand                   Hanks                            122 Intermediate Java Programming                      
etc...

但是当我尝试选择教授 Java 课程最多的讲师时,我得到了完全不同的结果

SELECT z.FIRST_NAME,z.LAST_NAME,b.COURSE_NO,b.DESCRIPTION
FROM INSTRUCTOR z
JOIN SECTION w ON z.INSTRUCTOR_ID = w.INSTRUCTOR_ID
JOIN COURSE b ON w.COURSE_NO = b.COURSE_NO
WHERE DESCRIPTION like '%Java%'
GROUP BY z.FIRST_NAME,z.LAST_NAME,b.COURSE_NO,b.DESCRIPTION
HAVING MAX(b.DESCRIPTION) =
(SELECT MAX(DESCRIPTION) 
FROM (
SELECT z.FIRST_NAME,z.LAST_NAME,b.COURSE_NO, MAX(b.DESCRIPTION) AS DESCRIPTION
FROM INSTRUCTOR z
JOIN SECTION w ON z.INSTRUCTOR_ID = w.INSTRUCTOR_ID
JOIN COURSE b ON w.COURSE_NO = b.COURSE_NO
WHERE DESCRIPTION like '%Java%'
GROUP BY z.FIRST_NAME,z.LAST_NAME,b.COURSE_NO
 )
 )
ORDER BY z.FIRST_NAME,z.LAST_NAME,b.COURSE_NO,b.DESCRIPTION;

我如何计算这些描述 Java 课程并从中选择最大值,以便它只能显示一位讲师的所有 Java 课程?

4

1 回答 1

2

也许是这样的:

WITH q AS (
SELECT z.FIRST_NAME,z.LAST_NAME,b.COURSE_NO, MAX(b.DESCRIPTION) AS DESCRIPTION
     , COUNT(*) OVER (PARTITION BY z.FIRST_NAME, z.LAST_NAME) TheCount
  FROM INSTRUCTOR z
       JOIN SECTION w ON z.INSTRUCTOR_ID = w.INSTRUCTOR_ID
       JOIN COURSE b ON w.COURSE_NO = b.COURSE_NO
 WHERE UPPER(DESCRIPTION) like '%JAVA%'
 GROUP BY z.FIRST_NAME,z.LAST_NAME,b.COURSE_NO
)
SELECT first_name, last_name, course_no, description
  FROM q
 WHERE TheCount = (SELECT MAX(TheCount) FROM q);

请注意,这可能会为您提供不止一名讲师。

此外,我已经比较了使用全部大写的课程描述搜索字符串,以消除由于 JAVA 的大小写不同而错过课程的可能性。

编辑:

有许多 SQL 函数可以用作“分析”函数——该函数应用于“窗口”内的记录,即 PARTITION BY 子句。其中一些对排序也很敏感,也可以使用 ORDER BY 子句。您可以在 Tim Hall 的网站上找到一些很好的参考资料。另一个在Shouvik Basu 的博客上

于 2013-10-19T04:18:08.750 回答