2015-12-30 4 views
0

Я новичок в SQL. Я использую SQL Server.Выберите записи на основе одного отдельного столбца

Я пишу запрос, чтобы получить лучшие оценки (sc) каждого пользователя (уникально).

Я написал запрос, который приводит к таблице, имеющей неповторимые значения pname и pid.

У меня есть следующая результирующей таблица

id  pid pname sc 
___________________________ 

1584 268 user1 99 
1608 268 user1 99 
1756 268 user1 95 
1750 268 user1 95 
1240 268 user1 94 
1272 268 user1 94 
1290 268 user1 93 
1298 268 user1 93 
1177 268 user1 93 
1488 268 user1 93 
1401 268 user1 92 
1407 268 user1 92 
1482 268 user1 89 
1245 268 user1 89 
1705 268 user1 88 
2848 310 user2 81 
2888 310 user2 81 
1178 268 user1 80 
2084 50 user3 80 
2727 50 user3 80 
2729 50 user3 80 
2782 50 user3 80 
2792 50 user3 79 
2848 50 user3 79 
2851 310 user2 79 
2833 310 user2 78 
2851 50 user3 78 
2857 50 user3 78 
2619 50 user3 77 
2890 50 user3 77 
2593 310 user2 77 
2596 310 user2 77 
2792 310 user2 77 
2810 310 user2 77 
2806 310 user2 76 

из этого запроса

SELECT 
    t.id, 
    t.pid, 
    u.pname, 
    t.sc 
FROM 
    table t, 
    table u 
WHERE 
    t.pid=u.pid 
GROUP BY 
    id, 
    pid, 
    u.pname 
ORDER BY 
    sc DESC 

Что я хочу, чтобы иметь уникальный pnames в моей результирующей таблице. Например, требуемая мощность должна быть:

id  pid pname sc 
___________________________ 

1584 268 user1 99 
2851 310 user2 79 
2084 50 user3 80 

т.е. первый максимум «СБН» каждого пользователя

Спасибо!

+2

Тэг ваш вопрос с базой данных, которую вы используете. –

+0

с использованием SQL Server – Khubaib

ответ

2

Типичным подходом к этой проблеме является не GROUP BY, а функции окна. Это стандартные функции ANSI, которые включают в ROW_NUMBER():

SELECT id, pid, pname, sc 
FROM (SELECT t.id, t.pid, u.pname, t.sc, 
      ROW_NUMBER() OVER (PARTITION BY u.pid ORDER BY t.sc DESC) as seqnum 
     FROM table t JOIN 
      table u 
      ON t.pid = u.pid 
    ) tu 
WHERE seqnum = 1; 
+0

спасибо большое @Gordon работает :) – Khubaib

0

Вы можете использовать простой SQL запрос следующим образом:

SELECT t.ID, t.pid, u.pname, t.sc 
FROM table1 t, 
    table2 u 
WHERE t.pid = u.pid 
    AND t.sc = (
     SELECT MAX(d.sc) 
     FROM table1 d 
     WHERE t.pname = d.pname 
    ) 
ORDER BY sc DESC 
1

Вы можете попробовать это:

select id,pid,pname,sc 
from 
(
    select t.id,t.pid,u.pname,t.sc, 
      DENSE_RANK() over (partition by pname order by sc desc) as rank 
    from t,u where t.pid=t.pid=u.pid 
) x 
where x.rank=1; 

, как я только что создали одна таблица основана на ваших данных после запуска. Я получаю следующий вывод.

select id,pid,pname,sc from 
(
    select id,pid,pname,sc, 
    DENSE_RANK() over (partition by pname order by sc desc) as rank 
    from t 
) x 
where x.rank=1; 

Результат запроса:

enter image description here