寻找连续条纹和显示计数

时间:2017-08-06 08:04:21

标签: php mysql gaps-and-islands

我有一个MySQL表,显示以下内容:

ID              DATE    FREQUENCY
--        ----------    ---------
 1        2017-08-01            1
 2        2017-08-02            1
 3        2017-08-03            0
 4        2017-08-04            1
 5        2017-08-05            1
 6        2017-08-06            1

每次频率列上连续1时,我都试图获得最简单的分组方式。然后我想展示它们。

实施例

2 (There are 2 consecutive 1's)
3 (There are also 3 consecutive 1's)

谢谢

1 个答案:

答案 0 :(得分:0)

这是一个典型的隔岛问题。

您可以通过比较记录的总体排名与其在具有相同频率的记录组中的相对排名来解决。等级之间的差异为您提供了每个记录所属的组。

其余的只是过滤和汇总频率为1的组。

查询:

select 
    min(id) min_id,
    max(id) max_id,
    min(date) min_date,
    max(date) max_date,
    count(*) streak_length
from (
    select 
        t.*,
        row_number() over(order by date) rn1,
        row_number() over(partition by frequency order by date) rn2
    from mytable t
) t
where frequency = 1
group by rn1 - rn2
order by min_date

Demo on DB Fiddle 和示例数据:

min_id | max_id | min_date   | max_date   | streak_length
-----: | -----: | :--------- | :--------- | ------------:
     1 |      2 | 2017-08-01 | 2017-08-02 |             2
     4 |      6 | 2017-08-04 | 2017-08-06 |             3

注意:从MySQL 8.0开始,可以使用窗口函数row_number()