【问题标题】:Rank partition by the same value按相同值对分区进行排序
【发布时间】:2016-02-10 17:26:54
【问题描述】:

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

这是我的数据和想要的结果:

Pais Campaña Representante Actividad Racha **期望值** 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 中的每个更改 中重置计数,而不是when 'Actividad' is 0。对吗?
  • @VladimirBaranov:建议的副本用于 SQL Server,并且有更有效的解决方案。
  • @ErwinBrandstetter,Postgres 也有 LAGSUM() OVER(),不是吗?因此,该 SQL Server 解决方案可以在 Postgres 中运行。至于什么效率更高,很难猜测,应该在真实数据和真实硬件上进行测试。我的直觉是它们会非常相似。我的观点是,这是一个很常见的问题。

标签: sql postgresql pgadmin window-functions greenplum


【解决方案1】:

诀窍是用相同的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 子句中重复列(或表达式)。在外部窗口函数中重复相同顺序的行并仅附加另一列相对便宜,从而建立在预先排序的数据之上。

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

SQL Fiddle 带有扩展测试用例。

非常相似的案例:

在dba.SE上有详细解释的相关答案:

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

【讨论】:

  • 有很多 'Representante' 所以分区应该是这样的: row_number() OVER (PARTITION BY Representante,Actividad, grp ORDER BY Campana) AS rn 请改变它,你的 awnser 帮了我很多.
  • @MelgoV:是的,我们需要在外部PARTITION BY 中重复列以使其适用于所有情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2015-04-06
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多