按相同的值排序分区

时间:2015-11-09 22:46:53

标签: sql postgresql pgadmin window-functions greenplum

我正在使用GreenPlum引擎,我正在使用pgAdmin来查询数据,我只有读取权限所以我无法创建函数或程序,甚至我不知道为什么我无法使用变量

这是我的数据和期望的结果:

Pais    Campaña     Representante   Actividad   Racha   **Desired value**
96      20150302    758593197           1       1           1
96      20150303    758593197           1       2           2
96      20150304    758593197           1       3           3
96      20150305    758593197           0       1           1
96      20150306    758593197           1       4           1
96      20150307    758593197           0       2           1
96      20150308    758593197           0       3           2
96      20150309    758593197           1       5           1
96      20150310    758593197           0       4           1
96      20150311    758593197           0       5           2
96      20150312    758593197           0       6           3
96      20150313    758593197           0       7           4
96      20150314    758593197           1       6           1

这是我的一次尝试:

Select 
    Pais,Campaña,Representante,Actividad,
    rank() over(partition by Pais,Representante,Actividad
                order by Pais,Campaña,Representante) as Racha
From TEMP20151109
Order By Campaña;

所需的值是Actividad值连续性的计数,我需要在Actividad为0时重置计数。

1 个答案:

答案 0 :(得分:5)

诀窍是形成具有相同Actividad的连续行组,然后您可以轻松计算行号(rn):

SELECT Pais, Campana, Representante, Actividad
     , row_number() OVER (PARTITION BY Pais, Representante, Actividad, grp
                          ORDER BY Campana) AS rn
FROM  (
   SELECT Pais, Campana, Representante, Actividad
        , row_number() OVER (PARTITION BY Pais, Representante ORDER BY Campana)
       -  row_number() OVER (PARTITION BY Pais, Representante, Actividad
                             ORDER BY Campana) AS grp
   FROM   tbl
   ) sub
ORDER  BY Campana;

除了 PARTITION BY之外,您还必须在外部查询grp子句中重复列(或表达式)。在外部窗口函数中重复相同的行顺序并且只是追加另一列,从而建立在预先排序的数据上相对便宜。

根据缺少的表定义(哪些列是唯一的?)和PARTITION BY条件,某些列可能会从WHERE子句中删除。

带有扩展测试用例的

SQL Fiddle

非常相似的案例:

关于dba.SE的详细解释的相关答案:

顺便说一下,在原始ORDER BY子句(PARTITIONPais中使用的窗口函数的Representante子句中重复列是没有意义的。查询)。这只是噪音而没有效果。