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 コースで 1 人のインストラクターのみを表示するにはどうすればよいでしょうか?

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 句も使用できます。ここティム・ホールのサイト で、いくつかの優れた参考資料を見つけることができます。もう 1 つはShouvik Basu のブログにあります。

于 2013-10-19T04:18:08.750 に答える