如何选择每个ID的最后一条记录

时间:2021-02-06 06:07:31

标签: sql postgresql greatest-n-per-group

我需要从表中提取每个用户的最后一条记录。表架构如下所示。

mytable

product | user_id |
-------------------
   A    |   15    |
   B    |   15    |
   A    |   16    |
   C    |   16    |
-------------------

我想得到的输出是

product | user_id |
-------------------
   B    |   15    |
   C    |   16    |

基本上是每个用户的最后一条记录。

提前致谢!

4 个答案:

答案 0 :(得分:1)

您可以使用名为 ROW_NUMBER 的窗口函数。下面为您提供了一个解决方案。我还在 db-fiddle 中为你做了一个演示查询。请检查链接 Demo Code in DB-Fiddle

WITH CTE AS
(SELECT product, user_id,
       ROW_NUMBER() OVER(PARTITION BY user_id order by product desc)
       as RN
FROM Mytable)
SELECT product, user_id FROM CTE WHERE RN=1 ;

答案 1 :(得分:1)

除非您有指定排序的列,否则没有“最后”记录之类的东西。 SQL 表表示无序集(从技术上讲,多集)。

如果您有这样的列,请使用 distinct on:

select distinct on (user_id) t.*
from t
order by user_id, <ordering col> desc;

Distinct on 是一个非常方便的 Postgres 扩展,它为每个“组”返回一行。它是基于 order by 子句中指定的排序的第一行。

答案 2 :(得分:0)

您可以尝试使用 row_number()

select product,iserid
from
(
select product, userid,row_number() over(partition by userid order by product desc) as rn
from tablename
)A where rn=1

答案 3 :(得分:0)

您应该有一列存储广告订单。无论是通过自动递增还是带有日期和时间的值。

例如:

<头>
autoIncrement 产品 user_id
1 A 15
2 B 15
3 A 16
4 C 16
SELECT produt, user_id FROM table inner join 
     ( SELECT MAX(autoIncrement) as id FROM table group by user_id ) as table_Aux
     ON table.autoIncrement = table_Aux.id