Я обнаружил, что эта реализация компилируется с помощью MSVC2013. Обратите внимание, что только компилируется, все остальное не гарантируется.
https://github.com/mapbox/variant/blob/master/include/mapbox/optional.hpp
Непротестированный, но должен работать:
select * from users where points in
(select distinct top 3 points from users order by points desc)
Вот тот, который работает - я не знаю, более ли это эффективно, и это - SQL Server 2005 +
with scores as (
select 1 userid, 100 points
union select 2, 75
union select 3, 50
union select 4, 50
union select 5, 50
union select 6, 25
),
results as (
select userid, points, RANK() over (order by points desc) as ranking
from scores
)
select userid, points, ranking
from results
where ranking <= 3
Очевидно, первое "с" должно настроить значения, таким образом, можно протестировать второе с, и заключительная избранная работа - Вы могли запустить в "с результатов как...", если бы Вы запрашивали против существующей таблицы.
Как насчет:
select top 3 with ties points
from scores
order by points desc
Не уверенный, если "со связями" работает над чем-нибудь другой SQL Server.
На SQL Server 2005 и, можно передать "главное" число как международный параметр:
select top (@n) with ties points
from scores
order by points desc
Crucible получил его (принятие SQL, 2005 является опцией).
@Rob#37760:
select top N points from users order by points desc
Этот запрос только выберет 3 строки, если N будет равняться 3, посмотрите вопрос. "Лучшие 3" должны возвратить 5 строк.
На самом деле модификация к, ГДЕ В, используя ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ будет намного быстрее.
SELECT
userid, points
FROM users u
INNER JOIN
(
SELECT DISTINCT TOP N
points
FROM users
ORDER BY points DESC
) AS p ON p.points = u.points
@bosnic, я не думаю, что это будет работать согласно просьбе, я не настолько знаком с MS SQL, но я ожидал бы, что это возвратит только 3 строки и проигнорирует то, что 3 пользователя связываются для 3-го места.
Что-то вроде этого должно работать:
select userid, points
from scores
where points in (select top 3 points
from scores
order by points desc)
order by points desc
@Matt Hamilton
Ваши работы ответа с примером выше, но не работали бы, если бы набор данных равнялся 100, 75, 75, 50, 50 (куда он возвратил бы только 3 строки). TOP СО СВЯЗЯМИ только включает связи последней возвращенной строки...
@Espo спасибо за проверку в реальных условиях - добавил подвыбор для исправления для этого.
Я думаю, что самый легкий ответ к:
select userid, points from users
where points in (select distinct top N points from users order by points desc)
Если Вы хотите поместить это в сохраненный proc, который берет N в качестве параметра, то необходимо будет или сделать, читает, SQL в переменную затем выполняют его или делают прием количества строки:
declare @SQL nvarchar(2000)
set @SQL = "select userID, points from users "
set @SQL = @SQL + " where points in (select distinct top " + @N
set @SQL = @SQL + " points from users order by points desc)"
execute @SQL
или
SELECT UserID, Points
FROM (SELECT ROW_NUMBER() OVER (ORDER BY points DESC)
AS Row, UserID, Points FROM Users)
AS usersWithPoints
WHERE Row between 0 and @N
Оба примера принимают SQL Server и не были протестированы.
Попробуйте это
select top N points from users order by points desc