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 JOINすることでこれを正しく行うことができますが、無駄に思えます

 --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 のように正しい結果を返す方法はありますか?

Microsoft SQL Server 2000

編集:これを入力する最初の試みで、上記の2つの重要な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

もっと簡単な方法はないと思います。概念的には、2つのセットの共通部分です。ブランチに関するタプルのセットとそれを満たすタプルのセット。

于 2009-07-13T18:00:17.443 に答える
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 に答える
0

これを行う最も簡単な方法は、LibraryBranchId を取得して dayscheckedout を選択し、コードを記述した場所でそれらをプログラムでカウントし、最大 dayscheckedout もプログラムで取得することです。

于 2009-07-13T18:05:14.950 に答える