2015-04-12 2 views
1

У меня есть таблицапочему крест применять дает все строки и не топ N

 
name score 
samar 12 
pradeep 30 
garry 90 

Я хочу, чтобы получить верхние 2 баллов из приведенной выше таблицы. Это можно сделать с помощью функции row_number(). Но он также должен работать с перекрестным применением. Но мой нижеприведенный код дает все строки вместо второго балла.

select abc.score 
from #b as a 
cross apply (
    select top 2 score 
    from #b as 
    where b.name = a.name 
    order by b.score desc 
) as abc 

Не могли бы вы рассказать мне, что не так в приведенном выше коде.

+0

Вы запрашиваете верхние два счета за каждое 'имя'. Если у вас есть один балл за имя, это возвращает всю таблицу. Из вашего описания непонятно, почему 'select top (2) name, оценка от #b по счету desc' не работает для вас. – GSerg

+0

Хорошо спасибо .. Я хочу рассчитать сумму первых двух имен, которые являются samar и praddep, а затем получить проценты. Таким образом, результат должен быть 12/42 и 30/42. Игнорирование третьей строки – sam

+0

Является ли ответ только row_number()? – sam

ответ

1

Пожалуйста, проверьте, работает ли ниже запрос в вашем случае.

create table #b 
(name varchar(30), score int); 


insert into #b (name, score) 
values ('mohit',12), 
('pradeep',30), 
('garry',42) 


SELECT name, 
     score, 
     ROW_NUMBER() OVER(ORDER BY Score) RN 
INTO #c 
FROM #b 

SELECT name, 
     score, 
     CONVERT(NUMERIC,score)/ 
     (SELECT SUM(score) 
     FROM #c 
     WHERE RN <= 2) Percentage 
FROM #c 
WHERE RN <= 2 
Смежные вопросы