Postgresql 根据CTE提供的数字进行排名
在PostgreSQL 11中,我有一个复杂的情况,我需要根据一个数字生成一个编号,这个数字是我从CTE获得的 以下是CTEPostgresql 根据CTE提供的数字进行排名,postgresql,Postgresql,在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 LEF
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
预期产出将为
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
任何帮助/建议。编辑:我最近了解了一个函数,它非常适合这里: 您可以使用以下选项:
SELECT
*,
ntile(3) OVER (ORDER BY create_date)
FROM mytable
由于您已经创建了累计行数,因此可以使用该值创建预期的排名:
SELECT
*,
floor((queue_no - 1) / 3) + 1 as rank
FROM my_cte
队列号-1
(因此,1
到3
将被移动到0
到2
)3
区分:因此,0
到2
将是0.x
,3
到5
将是1.x
0
,1
,2
1
开始而不是0
,请添加1
@S-Man更改了我的问题,并添加了输入和输出。如果您能在这里提供帮助。非常感谢,工作非常完美!添加了更好的解决方案。