按相同值对分区进行排序
Rank partition by the same value
我正在使用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时我需要重新计数
诀窍是将具有相同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;
除了 grp
,您还必须在外部查询 的 PARTITION BY
子句中重复列(或表达式)。在外部 window 函数中重复相同的行顺序并仅附加另一列,从而建立在预先排序的数据上,相对便宜。
某些列可能会从 PARTITION BY
子句中删除,具体取决于缺少的 table 定义(哪些列是唯一的?)和 WHERE
条件。
SQL Fiddle 带有扩展测试用例。
非常相似的案例:
dba.SE的详细解释的相关回答:
顺便说一句,在 window 函数的 ORDER BY
子句中重复 PARTITION
子句(Pais
和 Representante
在您的原始查询中)。那只是没有效果的噪音。
我正在使用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时我需要重新计数
诀窍是将具有相同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;
除了 grp
,您还必须在外部查询 的 PARTITION BY
子句中重复列(或表达式)。在外部 window 函数中重复相同的行顺序并仅附加另一列,从而建立在预先排序的数据上,相对便宜。
某些列可能会从 PARTITION BY
子句中删除,具体取决于缺少的 table 定义(哪些列是唯一的?)和 WHERE
条件。
SQL Fiddle 带有扩展测试用例。
非常相似的案例:
dba.SE的详细解释的相关回答:
顺便说一句,在 window 函数的 ORDER BY
子句中重复 PARTITION
子句(Pais
和 Representante
在您的原始查询中)。那只是没有效果的噪音。