我是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
即。每个用户的第一个最大'sc'
谢谢!
答案 0 :(得分: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;
答案 1 :(得分: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;
查询结果:
答案 2 :(得分: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