SQL-запрос для получения вершины “n” очки из списка

Я обнаружил, что эта реализация компилируется с помощью MSVC2013. Обратите внимание, что только компилируется, все остальное не гарантируется.

https://github.com/mapbox/variant/blob/master/include/mapbox/optional.hpp

6
задан sqluser 5 June 2015 в 06:01
поделиться

10 ответов

Непротестированный, но должен работать:

select * from users where points in
(select distinct top 3 points from users order by points desc)
10
ответ дан 8 December 2019 в 14:49
поделиться

Вот тот, который работает - я не знаю, более ли это эффективно, и это - 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

Очевидно, первое "с" должно настроить значения, таким образом, можно протестировать второе с, и заключительная избранная работа - Вы могли запустить в "с результатов как...", если бы Вы запрашивали против существующей таблицы.

4
ответ дан 8 December 2019 в 14:49
поделиться

Как насчет:

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
1
ответ дан 8 December 2019 в 14:49
поделиться

Crucible получил его (принятие SQL, 2005 является опцией).

0
ответ дан 8 December 2019 в 14:49
поделиться

@Rob#37760:

select top N points from users order by points desc

Этот запрос только выберет 3 строки, если N будет равняться 3, посмотрите вопрос. "Лучшие 3" должны возвратить 5 строк.

0
ответ дан 8 December 2019 в 14:49
поделиться

На самом деле модификация к, ГДЕ В, используя ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ будет намного быстрее.

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
1
ответ дан 8 December 2019 в 14:49
поделиться

@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
0
ответ дан 8 December 2019 в 14:49
поделиться

@Matt Hamilton

Ваши работы ответа с примером выше, но не работали бы, если бы набор данных равнялся 100, 75, 75, 50, 50 (куда он возвратил бы только 3 строки). TOP СО СВЯЗЯМИ только включает связи последней возвращенной строки...

0
ответ дан 8 December 2019 в 14:49
поделиться

@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 и не были протестированы.

0
ответ дан 8 December 2019 в 14:49
поделиться

Попробуйте это

select top N points from users order by points desc
0
ответ дан 8 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: