How to group continuous ranges using MySQL

前端 未结 3 1385
温柔的废话
温柔的废话 2020-12-03 22:29

I have a table that contains categories, dates and rates. Each category can have different rates for different dates, one category can have only one rate at a given date.

相关标签:
3条回答
  • 2020-12-03 23:04

    MySQL doesn't support analytic functions, but you can emulate such behaviour with user-defined variables:

    SELECT   CatID, Begin, MAX(Date) AS End, Rate
    FROM (
      SELECT   my_table.*,
               @f:=CONVERT(
                 IF(@c<=>CatId AND @r<=>Rate AND DATEDIFF(Date, @d)=1, @f, Date), DATE
               ) AS Begin,
               @c:=CatId, @d:=Date, @r:=Rate
      FROM     my_table JOIN (SELECT @c:=NULL) AS init
      ORDER BY CatId, Rate, Date
    ) AS t
    GROUP BY CatID, Begin, Rate
    

    See it on sqlfiddle.

    0 讨论(0)
  • 2020-12-03 23:04
    SELECT catid,min(ddate),max(ddate),rate
    FROM (
        SELECT
            Catid,
            Ddate,  
            rate,
            @rn := CASE WHEN (@prev <> rate 
               or DATEDIFF(ddate, @prev_date)>1) THEN @rn+1 ELSE @rn END AS rn,
            @prev := rate,
            @prev_id := catid ,
            @prev_date :=ddate
        FROM (
            SELECT CatID,Ddate,rate 
            FROM rankdate
            ORDER BY CatID, Ddate ) AS a , 
            (SELECT @prev := -1, @rn := 0, @prev_id:=0 ,@prev_date:=-1) AS vars      
    
    ) T1 group by catid,rn
    

    Note: The line (SELECT @prev := -1, @rn := 0, @prev_id:=0 ,@prev_date:=-1) AS vars is not necessary in Mysql Workspace, but it is in the PHP mysql_query function.

    SQL FIDDLE HERE

    0 讨论(0)
  • 2020-12-03 23:05

    I know I am late, still posting a solution that worked for me. Had the same issue, here's how I got it

    Found a good solution using variables

    SELECT  MIN(id) AS id, MIN(date) AS date, MIN(state) AS state, COUNT(*) cnt
    FROM    (
        SELECT  @r := @r + (@state != state OR @state IS NULL) AS gn,
                @state := state AS sn,
                s.id, s.date, s.state
        FROM    (
                SELECT  @r := 0,
                        @state := NULL
                ) vars,
                t_range s
        ORDER BY
                date, state
        ) q
    GROUP BY gn
    

    More details at : https://explainextended.com/2009/07/24/mysql-grouping-continuous-ranges/

    0 讨论(0)
提交回复
热议问题