【问题标题】:oracle - maximum per grouporacle - 每组最大值
【发布时间】:2012-11-07 23:28:25
【问题描述】:

大学表 - UniversityName、UniversityId

租约表 - LeaseId、BookId、UniversityId、LeaseDate

Book Table - BookId、UniversityId、Category、PageCount。

对于每所大学,我必须找到出租图书数量最多的类别。

所以,像

UniversityName Category #OfTimesLeased 

我一直在使用Dense_Rank 等来玩弄它并取得了一些成功 - 但如果出现平局,则只有其中一个出现,而我希望它们都出现。

当前查询:

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

^无法解决平局问题并获取租借次数最多的图书类型的租借次数。

【问题讨论】:

  • 发布您当前的查询。

标签: sql oracle


【解决方案1】:

使用分析函数,您走在正确的轨道上:

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

我使用 row_number() 是因为您只想要一个最高值。当您查找“1”以外的值时,Rank 和 dense_rank 更有用。

如果您希望在出现平局时显示最高值,请使用dense_rank 而不是row_number。这些值将位于不同的行。

【讨论】:

  • 我认为他想要超过 1 个值,来自 op 的最后一条语句 - but if there is a tie, only one of them shows up, while I want both of them to show up.
【解决方案2】:

试试这个

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2020-12-26
    • 2018-03-06
    • 2022-06-11
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多