显示基于排名的记录,还删除重复的数据

时间:2013-10-28 05:32:22

标签: sql postgresql

我有一张这样的表

+------+------+------+------+
| col1 | col2 | col3 | rank |
+------+------+------+------+
|    1 | A    | X    |    4 |
|    2 | C    | Y    |    3 |
|    2 | C    | Y    |    3 |
|      | A    | X    |    3 |
|    1 | B    | Z    |    2 |
+------+------+------+------+

(5行)

我需要这样的o / p

+------+------+------+------+
| col1 | col2 | col3 | rank |
+------+------+------+------+
|    1 | A    | X    |    4 |
|    2 | C    | Y    |    3 |
|    1 | B    | Z    |    2 |
+------+------+------+------+

所以我写下面的查询

select col1,col2,col3,rank,dense_rank() over(order by rank desc) from table1;

但它没有给出正确的o / p

3 个答案:

答案 0 :(得分:1)

试试这个!!

select a.col1,a.col2,a.col3,max(a.rank) as rank 
          from [dbo].[5] a join [dbo].[5] b 
              on a.col1=b.col1 group by a.col1,a.col2,a.col3 

答案 1 :(得分:0)

看起来你需要使用max()进行聚合:

select
    col1,col2,col3,
    max(rnk)
from table1
group by col1,col2,col3

如果col1的一个组合可以有col2, col3的不同值,则distinct on就是您所需要的:

select distinct on (col2, col3)
    col1,col2,col3,
    rnk
from table1
order by col2, col3, rnk desc

<强> sql fiddle demo

答案 2 :(得分:0)

以下内容应符合您的要求:

select col1,col2,col3,rank,dense_rank() over(order by rank desc) from table1
 WHERE col1 IS NOT NULL
GROUP BY 1, 2, 3, 4;

如果需要,您还可以在order by子句中使用数字别名。