根据 PostgreSQL 8.0.2 中不同列的条件进行排名

Posted

技术标签:

【中文标题】根据 PostgreSQL 8.0.2 中不同列的条件进行排名【英文标题】:Ranking based on conditions of a different column in PostgreSQL 8.0.2 【发布时间】:2017-04-04 07:03:57 【问题描述】:

我有以下数据集:

 id |   date   | state
-----------------------
  1 | 01/01/17 | high
  1 | 02/01/17 | high
  1 | 03/01/17 | high
  1 | 04/01/17 | miss
  1 | 05/01/17 | high
  2 | 01/01/17 | miss
  2 | 02/01/17 | high
  2 | 03/01/17 | high
  2 | 04/01/17 | miss
  2 | 05/01/17 | miss
  2 | 06/01/17 | high

我想创建,使用 PostgreSQL 版本 8.0.2(与 Redshift 兼容)rank_state 列,在 id 的组中,按递增的 date 排列条目(从等级 0 开始)没有有“miss”的state。此外,如果条目具有“未命中”的state,则排名会重复。输出应如下所示:

 id |   date   | state | rank_state
------------------------------------
  1 | 01/01/17 | high  |    0
  1 | 02/01/17 | high  |    1
  1 | 03/01/17 | high  |    2
  1 | 04/01/17 | miss  |    2
  1 | 05/01/17 | high  |    3
  2 | 01/01/17 | miss  |    0
  2 | 02/01/17 | high  |    0
  2 | 03/01/17 | high  |    1
  2 | 04/01/17 | miss  |    1
  2 | 05/01/17 | miss  |    1
  2 | 06/01/17 | high  |    2

例如,第 4 行的排名为 2,因为它的 state 是“未命中”,即它重复第 3 行的排名(同样适用于第 9 行和第 10 行)。请注意,第 6 行和第 7 行的排名应为 0。

我尝试了以下方法: ,(case when state is not in ('miss') then (rank() over (partition by id order by date desc) - 1) end) as state_rank,rank() over (partition by id order by case when state is not in ('miss') then date end) as state_rank 但都没有给我想要的结果。任何想法都会非常有帮助。

问题与here 类似,但我正在尝试使用 PostgreSQL 版本 8.0.2 找到解决方案

【问题讨论】:

Redshift 也可以使用count() as a window function。你试过原来的答案吗?如果失败是什么错误? @pozs 感谢您的回复。是的,我确实尝试了原始响应 - 我收到以下错误:错误:带有 ORDER BY 子句的聚合窗口函数需要一个框架子句。 是的,redshift is slightly different。您需要ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(在ORDER BY 子句之后)——这是PostgreSQL 中使用ORDER BY 时的默认设置,因此通常省略 请不要使用 `postgresql.尽管 Redshift 基于(一个非常过时的版本)Postgres,但它已经大大偏离了。在此处查看有关其他“衍生产品”的类似讨论:dba.meta.stackexchange.com/q/2670/1822 @pozs 那你会回答吗? 【参考方案1】:

您只需将 frame_clause 添加到原始答案中,因为 Redshift 需要它:

select *
    , GREATEST(COUNT(case when state != 'miss' then 1 else null end) 
            OVER(PARTITION BY id order by date rows between unbounded preceding and current row) -1 , 0 ) as state_rank
from tbl;

【讨论】:

以上是关于根据 PostgreSQL 8.0.2 中不同列的条件进行排名的主要内容,如果未能解决你的问题,请参考以下文章

postgresql中列的不同值

将不同格式列的String数据类型的日期转换为PostgreSQL中的日期数据类型

如何编辑我的 postgreSQL 查询以按日期选择几列的最新行

如何在 PostgreSQL 8.0.2 中将列表转换为数组

如何根据pig中列的不同值拆分关系

如何根据另一列的聚合得到一列的对应值?