【问题标题】:SQL create dense rank based on mulitple columnsSQL基于多列创建密集排名
【发布时间】:2019-03-23 09:00:46
【问题描述】:

我有一个包含两个字段的数据集,我需要在其中创建密集排名。当 Field_1 不为空时,Field_2 为空,反之亦然。

Field_1 Field_2
a   
        1
        2
        3
        4
b   
        7
        8
        9
c   
        15
        20
        25

我正在努力解决这个问题

Field_1 Field_2 Field_3
a               1
        1       1
        2       1
        3       1
        4       1
b               2
        7       2
        8       2
        9       2
c               3
        15      3
        20      3
        25      3

我可以使用以下行对数据进行排序:

row_number() over (partition by null order by Field_2,Field_1) as Field_3

但这并没有给我我正在寻找的密集排名。

【问题讨论】:

  • 没有任何额外的列,我们怎么知道1-4应该和a属于同一个组?
  • 叹息..这是一个粗略的数据集。提供的数据是一个示例,但我提供的row_number 是数据的排序方式。它是顺序的。我希望制定一个查询来填补 Field_1 中的空白,但我不想进行递归查询。

标签: sql teradata rank dense-rank


【解决方案1】:

假设您确实有某种递增的行号列(我们称之为row_number),您可以使用窗口子句来计算填充的field_1 值的数量:

COUNT(field_1) OVER (ORDER BY row_number ROWS UNBOUNDED PRECEDING) AS group_number

这使得每一行计算填充的field_1 值的数量,这些值在由row_number 排序时之前它(包括它本身)。

以下是有关该技术的更多详细信息:https://stackoverflow.com/a/30862368/477563

【讨论】:

  • 感谢工作!我使用帖子中的“Field_3”作为row_number
  • 我也想出了一个不同的方法,但更复杂。 select qry1.Field_1 ,qry1.Field_2 ,Cast(Sum(qry1.Field_1_Binary) over (Partition By null Order By qry1.Field_3 Rows Between Unbounded Preceding and Current Row) as Float) as Rank_Field from ( Select Field_1 ,Field_2 ,row_number() over (partition by null order by Field_2,Field_1) as Field_3 ,case when Field_1 = null then 1 else 0 end as Field_1_Binary ) as qry1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
相关资源
最近更新 更多