2

大学テーブル - UniversityName、UniversityId

リース テーブル - LeaseId、BookId、UniversityId、LeaseDate

Book テーブル - BookId、UniversityId、Category、PageCount。

大学ごとに、貸出本数が最も多いカテゴリを見つける必要があります。

だから、次のようなもの

UniversityName Category #OfTimesLeased 

私は etc を使用していくつかの成功を収めて遊んでいますDense_Rankが、同点の場合は、そのうちの 1 つだけが表示されますが、両方が表示されるようにします。

現在のクエリ:

select b.UniversityId, MAX(tempTable.type) KEEP (DENSE_RANK FIRST ORDER BY tempTable.counter DESC)
from book b 
join 
(select count(l.leaseid) AS counter, b.category, b.universityid
from lease l
join book b
on b.bookid =l.bookid AND b.universityid=r.universityid
 group by b.category, b.universityid) tempTable
 on counterTable.universityid= b.universityid
 group by b.universityid

^タイの問題を解決できず、最もリースされた本の種類のリース数を取得できません。

4

2 に答える 2

1

これを試して

WITH CTE AS
(
SELECT UniversityName, Category, Count(*) NumOfTimesLeased 
FROM University u
INNER JOIN Book b on u.UniversityId = b.UniversityId
INNER JOIN Lease l on b.bookid = l.bookid and b.UniversityId = l.UniversityId
GROUP BY UniversityName, Category    
), 
CTE2 AS (
SELECT UniversityName, Category, NumOfTimesLeased,
RANK() OVER (PARTITION BY UniversityName 
             ORDER BY NumOfTimesLeased DESC) Rnk
FROM CTE)

SELECT * FROM CTE2 WHERE Rnk = 1
于 2012-11-19T23:19:23.383 に答える
0

分析関数を使用して正しい軌道に乗っています。

select Univerity, Category, NumLeased
from (select t.*,
             row_number() over (partition by university order by Numleased desc) as seqnum
      from (select l.university, b.category, count(*) as NumLeased
            from lease l join
                 book b
                 on l.bookid = b.bookid
            group by l.university, b.category
           ) t
     ) t
where seqnum = 1

一番上の値が 1 つだけ必要なため、row_number() を使用します。"1" 以外の値を探している場合は、Rank と Dense_rank がより便利です。

同点の場合に上位の値を表示する場合は、dense_rank代わりに を使用しrow_numberます。値は異なる行にあります。

于 2012-11-19T23:17:12.707 に答える