Как выбрать все лучшие результаты N с таким же лучшим значением - PullRequest
2 голосов
/ 25 мая 2019

У меня есть таблица 'reports' и столбцы там 'Id', 'authorId' и другие столбцы.Там у меня есть вторая таблица 'users' с [Id], [Nick] и т.д ...

Я бы хотел получить ник и количество его отчетов, и я хотел бы получить только лучшезаписей.
Например,

  • , если у меня будет три пользователя с наибольшим количеством отчетов, я получу три.

  • Если будет 8 пользователей с наибольшим количеством записей, я получу 8 пользователей.

Возможно, у него будет действительно простое решение, но я застрял на этом ....

Спасибо заранее.

Ответы [ 3 ]

0 голосов
/ 25 мая 2019

Попробуйте этот скрипт с помощью подзапроса-

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
)
0 голосов
/ 25 мая 2019

Сгруппируйте и посчитайте отчеты, затем свяжите их с автором.Попросите ТОП 1 с галстуками, упорядоченными по убыванию количества отчетов.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

Если у Джона, Джеймса и Джейка будет 500 отчетов, то результаты будут:

John, 500
James, 500
Jake, 500

Если Джейк вдруг сделает еще один, и он станет единственным лидером, результаты будут такими:

Jake, 501

TOP x WITH TIES берет x записей, затем смотрит на то, что заказывает (reportcount) и несетпри получении записей, которые имеют тот же отчетный счет, что и последняя строка, которую нужно взять

Если ваш набор результатов был:

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

И вы запросили ТОП 3 с связями, то ТОП 3:

James, 503
Jake, 501
Jim, 500

Мы ЗАРЯДИМСЯ по количеству отчетов, последняя строка из вышеприведенных 3 имеет 500 в качестве счетчика отчетов, поэтому БД будет продолжать принимать другие строки, которые также имеют 500 в качестве числа отчетов:

 James, 503
Jake, 501
Jim, 500
John, 500
Julie, 500
0 голосов
/ 25 мая 2019

Вы можете использовать синтаксис top with ties:

SELECT   TOP 1 WITH TIES nick, COUNT(*)
FROM     users u
JOIN     report r ON u.id = r.authoerId
GROUP BY nick
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...