Postgres 窗口函数 - rank() 按 bigint 分区

Posted

技术标签:

【中文标题】Postgres 窗口函数 - rank() 按 bigint 分区【英文标题】:Postgres window functions - rank() partition by bigint 【发布时间】:2019-03-07 22:35:59 【问题描述】:

我正在尝试按类型为 bigint 的列对分区上的数据进行排名,但是当我将分区中的列更改为带有时区的时间戳类型的列时,它不起作用。

我的查询如下所示:

select id,ts_insert,serial_no,rank() over (partition by serial_no order by serial_no desc) from schema.table_name

结果如下:

1,'2019-02-19 18:27:50.258846+11',19516,1
1,'2019-02-19 18:27:50.258846+11',19515,1
1,'2019-02-19 18:27:50.258846+11',19514,1
1,'2019-02-06 19:45:38.896062+11',15069,1
1,'2019-02-05 21:46:28.633325+11',14827,1

预期结果是:

1,'2019-02-19 18:27:50.258846+11',19516,1
1,'2019-02-19 18:27:50.258846+11',19515,2
1,'2019-02-19 18:27:50.258846+11',19514,3
1,'2019-02-06 19:45:38.896062+11',15069,4
1,'2019-02-05 21:46:28.633325+11',14827,5

有人可以帮帮我吗?

提前谢谢...

【问题讨论】:

【参考方案1】:

你似乎想要:

select id, ts_insert, serial_no,
       rank() over (partition by id order by serial_no desc)
from schema.table_name;

serial_no 是唯一的(至少在您提供的数据中)。如果按唯一列进行分区,则rank() 将始终为1

【讨论】:

没错,serial_no 是唯一的,感谢您的回复。我可以使用什么来选择 serial_no 列中的最大值? @Victor 。 . .这就是order by 所做的。如果要过滤结果,请使用子查询并添加where rnk = 1

以上是关于Postgres 窗口函数 - rank() 按 bigint 分区的主要内容,如果未能解决你的问题,请参考以下文章

具有等级的postgres窗口函数

窗口函数 RANK()、DENSE_RANK() 等的特殊情况

MySQL8.0窗口函数之排名函数(rankdense_rank)的使用

MySQL8.0窗口函数之排名函数(rankdense_rank)的使用

mysql窗口函数rank() over、dense_rank() over、row_number() over 使用心得

Postgres - 如何对窗口函数列的每 x 行求和?