ROW_NUMBER() OVER ( PARTITION BY d.string_value ORDER BY a.create_time DESC ) AS rn

ROW_NUMBER() OVER (PARTITION BY d.string_value ORDER BY a.create_time DESC) AS rn 是一个窗口函数的用法。它的作用是根据指定的分组和排序条件,为每行分配一个唯一的递增编号。我们可以分解并详细说明这段代码的含义:

  1. ROW_NUMBER():

    • ROW_NUMBER() 是一个窗口函数,用来生成一个从 1 开始的递增数字,给每行分配一个编号。
    • 不同于直接排序,它允许我们在数据分组的基础上编号,因此非常适合在分组内做排序、筛选等操作。
  2. OVER 子句:

    • OVER 子句定义了窗口函数的应用范围。
    • 在这里,OVER 子句包含了 PARTITION BY 和 ORDER BY,指定了分组和排序的规则。
  3. PARTITION BY d.string_value:

    • PARTITION BY 用来分组,将数据根据 d.string_value 的不同值划分成多个分组。
    • 比如,d.string_value 有两个值 1 和 2,那么 PARTITION BY d.string_value 会将数据分成两个分组,分别是 string_value = 1 和 string_value = 2。
  4. ORDER BY a.create_time DESC:

    • ORDER BY 用于在分组内排序。在每个分组中,它会根据 a.create_time 进行降序排列。
    • DESC 表示降序,时间越新的数据排在前面。
    • 这样,每个分组中,最新的记录将获得编号 1,然后依次递增。
  5. AS rn:

    • AS rn 是为生成的编号列取一个别名 rn,用于后续查询引用。

      示例解释

      假设我们有以下数据:

      apply_idstring_valuecreate_time
      112024-01-01 10:00
      212024-01-02 10:00
      322024-01-01 10:00
      422024-01-03 10:00

      在 PARTITION BY 和 ORDER BY 的作用下,ROW_NUMBER() 会这样分配编号:

      apply_idstring_valuecreate_timern
      212024-01-02 10:001
      112024-01-01 10:002
      422024-01-03 10:001
      322024-01-01 10:002

      这样,通过 rn 列,我们可以方便地选择每种 string_value 分组的前几条记录,比如 rn <= 5 表示每组的前五条。

更多推荐