如何选择具有相同最佳值的所有最佳N个结果

时间:2019-05-25 07:09:39

标签: sql-server

我有表'reports',并且列有'Id','authorId'和其他更多列。那里有第二张表'users',其中有[Id][Nick]等...

我想获取昵称和报告​​数量,我想获得最好的记录。
例如,

  • 如果我将拥有三个报告数量最多的用户,我将得到 三个。

  • 如果有8个用户的记录数最多,我将得到8个 用户。

可能会有非常简单的解决方案,但是我对此感到困惑。...

谢谢。

3 个答案:

答案 0 :(得分:0)

您可以使用top with ties语法:

SELECT   TOP 1 WITH TIES nick, COUNT(*)
FROM     users u
JOIN     report r ON u.id = r.authoerId
GROUP BY nick

答案 1 :(得分:0)

在子查询的帮助下尝试使用此脚本-

SELECT U.ID 
FROM Users  U
INNER JOIN Report R ON U.ID = R.AuthorId 
GROUP BY U.ID
HAVING COUNT(*) =
(
    SELECT TOP 1 COUNT(*) 
    FROM Users  U
    INNER JOIN Report R ON U.ID = R.AuthorId 
    GROUP BY U.ID
    ORDER BY COUNT(*)  DESC
)

答案 2 :(得分:0)

分组并计数报告,然后将其与作者关联。要求按报告数降序排列“ TOP 1 WITH TIES”。 WITH TIES将确保所有并列第一的人都将被包括在内

SELECT TOP 1 u.Nick, R.ReportCount 
FROM 
  Users  U
  INNER JOIN 
  (
    SELECT AuthorID, COUNT(*) as ReportCount
    FROM Report 
    GROUP BY AuthorID
  ) R
  ON U.ID = R.AuthorID
ORDER BY R.ReportCount DESC

如果John,James和Jake都有500个报告,那么结果将是:

John, 500
James, 500
Jake, 500

如果杰克突然再做一个人,所以他是唯一的领导者,那么结果将是:

Jake, 501

TOP x WITH TIES接受x条记录,然后查看(报告计数)所订购的内容,并继续进行报告,其报告计数与要采取的LAST行相同

如果您的结果集为:

James, 503
Jake, 501
Jim, 500
John, 500
Julie, 500
Jeffrey 499

您问过TOP 3 WITH TIES,那么TOP 3是:

James, 503
Jake, 501
Jim, 500

我们对报告计数进行排序,上述3中的LAST行的报告计数为500,因此数据库将继续采用其他也有500作为报告计数的行:

 James, 503
Jake, 501
Jim, 500
John, 500
Julie, 500