postgresql - 根据 CTE 的数字获取排名
问题描述
我在 PostgreSQL 11 中有一个复杂的情况,我需要根据从 CTE 获得的单个数字生成编号。
下面是CTE
WITH pending_orders_to_be_processed_details
AS
(
SELECT ROW_NUMBER() OVER(ORDER BY so.create_date ) as queue_no
, name,so.create_date ::TIMESTAMP
FROM picking sp
LEFT JOIN order so ON so.name=sp.origin
WHERE sp.state IN('assigned','confirmed')
)
,orders_which_can_be_processed_today AS
(
-- This CTE will give me a count of orders
and its hourly average, Lets say count is 400 and hourly avg is 3
)
现在我需要根据每小时的平均值对细节进行编号,意味着前 3 个订单需要排名为 1,接下来的 3 个订单需要排名为 2,依此类推,这样我就可以确定这些可以根据这个排名。
输入将是
name queu_number. create_date
so1 1 2021-03-11 12:00:00
so2 2 2021-03-11 13:00:00
so3 3 2021-03-11 14:00:00
so4 4 2021-03-11 15:00:00
so5 5 2021-03-11 16:00:00
so6 6 2021-03-11 17:00:00
so7 7 2021-03-11 18:00:00
so8 8 2021-03-11 19:00:00
so9 9 2021-03-11 20:00:00
预期的输出将是
name rank
so1 1
so2 1
so3 1
so4 2
so5 2
so6 2
so7 3
so8 3
so9 3
任何帮助/建议。
解决方案
编辑:我最近了解了一个非常适合这里的函数:
您可以为此使用ntile()
窗口函数:
SELECT
*,
ntile(3) OVER (ORDER BY create_date)
FROM mytable
由于您已经创建了累积行数,您可以使用它来创建您的预期排名:
SELECT
*,
floor((queue_no - 1) / 3) + 1 as rank
FROM my_cte
queue_no - 1
(所以,1
to3
将被转移到0
to2
)- 区别
3
:所以,0
将2
是0.x
和3
将5
是1.x
,... - 现在将这些结果四舍五入为
0
,1
,2
, ... - 如果您想以
1
代替开头0
,请添加1
推荐阅读
- javascript - JS 可以判断复选框何时被选中或未选中?
- rest - AWS ALB 后面的微服务(ish)设置中的健康检查路由组织
- typescript - TypeScript 中的“复合类型”
- sql-server - 如何将多月数据放入多列
- git - 使用 Visual Studio 代码在 Visual Studio Team Server(或 gitlab)上创建远程 git 存储库
- c++ - 在排序的文本文件中实现二进制搜索?
- angularjs - 使用 ng-options 和 'as' 设置标签('track by' 替代方案)
- python - 从 Sage 中提取单一解决方案
- javascript - React 中状态更新时动态更改获取请求 url
- events - Google 表格 onEdit 事件不起作用