根据一个不同的列选择记录

时间:2015-12-30 11:41:56

标签: sql sql-server

我是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'

谢谢!

3 个答案:

答案 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;

查询结果:

enter image description here

答案 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