4

我想编写一个 T-SQL 查询,它不仅返回最大值,还返回具有最大值的行数。一定有比我想出的更好的方法

 --wrong way 
 select LibraryBranchId, max(daysCheckedOut), count(daysCheckedOut) 
 from books group by LibraryBranchId

 LibraryBranchId   Expr1      Expr2
 ----------------------------------
 1                 100       398503  (WRONG!)
 2                 75         94303  (WRONG!)
 3                 120       103950  (WRONG!)

我可以通过 INNER JOINing 子查询来正确地做到这一点,但这似乎很浪费

 --right way, but seems WAY too long
 select LibraryBranchId,max(daysCheckedOut),count(daysCheckedOut)
 from books inner join 
   ( select LibraryBranchId, max(daysCheckedOut) as maxDaysCheckedOut
     from books group by LibraryBranchId ) as maxbooks 
 on books.LibraryBranchId=maxbooks.LibraryBranchId
 where daysCheckedOut=maxDaysCheckedOut
 group by LibraryBranchId 

 LibraryBranchId   Expr1      Expr2
 ----------------------------------
 1                 100           17  (RIGHT!)
 2                 75            11  (RIGHT!)
 3                 120            2  (RIGHT!)

那么有没有一种方法与查询#1 一样简单,但返回与查询#2 一样的正确结果?

微软 SQL 服务器 2000

编辑:我在第一次尝试输入时错过了上面两个重要的 GROUP BY,我添加了它们 编辑:假装 Cade Roux 写的版本是我写的

4

4 回答 4

2

我认为这是对的:

SELECT maxbooks.LibraryBranchId, maxbooks.maxDaysCheckedOut, count(*)
FROM books
INNER JOIN (
    SELECT LibraryBranchId, max(daysCheckedOut) AS maxDaysCheckedOut
    FROM books
    GROUP BY LibraryBranchId
) AS maxbooks
    ON books.LibraryBranchId = maxbooks.LibraryBranchId
    AND books.daysCheckedOut = maxbooks.maxDaysCheckedOut
GROUP BY maxbooks.LibraryBranchId, maxbooks.maxDaysCheckedOut

我认为没有更简单的方法 - 从概念上讲,它是两个集合的交集。关于分支的元组集和满足它的元组集。

于 2009-07-13T18:00:17.443 回答
0

最简单的方法是获取您的 LibraryBranchId 并选择您的 dayscheckedout,然后在您编写代码的任何地方以编程方式计算它们,并以编程方式获取最大 dayscheckedout。

于 2009-07-13T18:05:14.950 回答
0

另一种“浪费”方式:

select LibraryBranchId, avg(daysCheckedOut) as maxDaysCheckedOut, count(*)
from
(
    select LibraryBranchId, daysCheckedOut
    from books b1
    where not exists 
    (
        select *
        from books b2
        where b2.LibraryBranchId = b1.LibraryBranchId
        and b2.daysCheckedOut > b1.daysCheckedOut
     )
) t
group by LibraryBranchId
于 2009-07-13T18:26:29.760 回答
0

这个怎么样?

select LibraryBranchId, MAX(daysCheckedOut), count(daysCheckedOut)
from books B
where daysCheckedOut = (select MAX(daysCheckedOut) from books where LibraryBranchID = B.LibraryBranchID)
group by LibraryBranchId 
于 2009-07-13T18:16:14.070 回答