按一列选择行值应该只重复N次

时间:2017-11-30 09:20:08

标签: postgresql

我的表是:

id  sub_id datetime    resource
---|-----|------------|-------
1  | 10  | 04/03/2009 | 399 
2  | 11  | 04/03/2009 | 244
3  | 10  | 04/03/2009 | 555
4  | 10  | 03/03/2009 | 300
5  | 11  | 03/03/2009 | 200
6  | 11  | 03/03/2009 | 500
7  | 11  | 24/12/2008 | 600
8  | 13  | 01/01/2009 | 750
9  | 10  | 01/01/2009 | 760
10 | 13  | 01/01/2009 | 570
11 | 11  | 01/01/2009 | 870
12 | 13  | 01/01/2009 | 670
13 | 13  | 01/01/2009 | 703
14 | 13  | 01/01/2009 | 705

我需要为每个sub_id选择2次

结果将是:

id  sub_id datetime    resource
---|-----|------------|-------
1  | 10  | 04/03/2009 | 399 
3  | 10  | 04/03/2009 | 555
5  | 11  | 03/03/2009 | 200
6  | 11  | 03/03/2009 | 500
8  | 13  | 01/01/2009 | 750
10 | 13  | 01/01/2009 | 570

如何在postgres中实现此结果?

2 个答案:

答案 0 :(得分:1)

使用窗口函数row_number():

select id, sub_id, datetime, resource
from (
    select *, row_number() over (partition by sub_id order by id)
    from my_table
    ) s
where row_number < 3;

答案 1 :(得分:1)

查看订单栏(我使用id来匹配您的样本):

t=# with data as (select *,count(1) over (partition by sub_id order by id) from t)
select id,sub_id,datetime,resource from data where count <3;
 id | sub_id |  datetime  | resource
----+--------+------------+----------
  1 |     10 | 2009-03-04 |      399
  3 |     10 | 2009-03-04 |      555
  2 |     11 | 2009-03-04 |      244
  5 |     11 | 2009-03-03 |      200
  8 |     13 | 2009-01-01 |      750
 10 |     13 | 2009-01-01 |      570
(6 rows)