Sql 如何为每个id选择前2个值

Sql 如何为每个id选择前2个值,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,我有一张有价值观的桌子 id sales date 1 5 "2015-01-04" 1 3 "2015-01-03" 1 1 "2015-01-01" 1 1 "2015-01-01" 2 7 "2015-01-05" 2 6 "2015-01-04" 2 4 "2015-01-03" 3 11 "2015-01-08" 3 10 "2015-01-07" 3 9 "2015-01-06" 3 8 "

我有一张有价值观的桌子

id  sales     date
1   5   "2015-01-04"
1   3   "2015-01-03"
1   1   "2015-01-01"
1   1   "2015-01-01"
2   7   "2015-01-05"
2   6   "2015-01-04"
2   4   "2015-01-03"
3   11  "2015-01-08"
3   10  "2015-01-07"
3   9   "2015-01-06"
3   8   "2015-01-05"
我想选择每个id的前两个值,如所需输出中所示

期望输出:

id   sales     date
 1    5        "2015-01-04"
 1    3        "2015-01-03"
 2    7        "2015-01-05"
 2    6        "2015-01-04"
 3    11       "2015-01-08"
 3    10       "2015-01-07"
我的尝试:

有人能帮我吗。提前谢谢你

select transactions.salesperson_id, transactions.id, transactions.date
from transactions
ORDER BY transactions.salesperson_id ASC, transactions.date DESC;

这可以使用窗口功能完成:

select id, sales, "date"
from (
  select id, sales, "date", 
         dense_rank() over (partition by id order by "date" desc) as rnk
  from transactions
) t
where rnk <= 2;

如果同一日期有多行,这可能会返回两行以上的同一ID。如果不需要,请使用行编号而不是密集排列

这可以使用窗口函数完成:

select id, sales, "date"
from (
  select id, sales, "date", 
         dense_rank() over (partition by id order by "date" desc) as rnk
  from transactions
) t
where rnk <= 2;
如果在同一日期有多行,这可能会为同一ID返回两行以上的行。如果您不希望这样,请使用行编号而不是密集排列

行编号将得到您想要的

select * from 
    (select row_number() over (partition by id order by date) as rn, sales, date from transactions) t1
where t1.rn <= 2
排号会得到你想要的

select * from 
    (select row_number() over (partition by id order by date) as rn, sales, date from transactions) t1
where t1.rn <= 2

前两名基于什么?销售价值?日期?前两名基于日期前两名基于什么?销售价值?日期?前两个基于日期我收到错误子查询必须有别名name@DevanshuKhokhani:抱歉,fixedI收到错误子查询必须有别名name@DevanshuKhokhani:对不起,修好了