Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 根据CTE提供的数字进行排名_Postgresql - Fatal编程技术网

Postgresql 根据CTE提供的数字进行排名

Postgresql 根据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

在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
预期产出将为

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更改了我的问题,并添加了输入和输出。如果您能在这里提供帮助。非常感谢,工作非常完美!添加了更好的解决方案。