如何获得可重复使用的分区作为新的分区?

时间:2019-03-24 16:27:27

标签: mysql sql window-functions

OVER子句中的“ Partition by”将所有值分组为唯一值,就像“ Distinct”或“ Group by”那样。

这是我在使用row_number()查询时的工作方式:

    id st t  row_number
    -------------------
    1  1  1  1
    1  1  2  2
    1  1  3  3
    2  1  3  1
    1  2  4  1
    1  1  10 4

这就是我想要的:

    id st t  uniq_row_number
    ------------------
    1  1  1  1
    1  1  2  2
    1  1  3  3
    2  1  3  1
    1  2  4  1
    1  1  10 1

无论之前是否有新字符串,每次更改分区后,它都会被读取为新分区。 如果分区重复,则uniq_row_number将获得+1。如果新分区带有新字符串:boom,它将获得uniq_row_number 1。

我的SQL查询:

    SELECT id, st, t,
    row_number() OVER (PARTITION BY id, st ORDER BY id, st) cat_num,
    min(t) over (PARTITION BY id, st) min_t,
    max(t) over (PARTITION BY id, st) max_t
    FROM tabl ORDER BY t;

SQL代码在这里:http://sqlfiddle.com/#!18/d4290/2

1 个答案:

答案 0 :(得分:1)

这称为“缺口和孤岛”问题。您需要为每个具有相似值的“岛”定义一个组。然后,您可以使用row_number()

行号的不同是定义岛的便捷方法:

select t.*,
       row_number() over (partition by id, seqnum_t - seqnum_it
                          order by t
                         ) as uniq_row_number
from (select t.*,
             row_number() over (order by t) as seqnum_t,
             row_number() over (partition by id order by t) as seqnum_it,
      from t
     ) t;

了解其工作原理的最佳方法是查看子查询的结果。您应该能够看到行号的差异如何定义您关心的组。