代码之家  ›  专栏  ›  技术社区  ›  Luis felipe De jesus Munoz

按日期范围划分的SQL分区

  •  2
  • Luis felipe De jesus Munoz  · 技术社区  · 6 年前

    假设这是我的桌子:

    ID  NUMBER  DATE
    ------------------------
    1   45      2018-01-01
    2   45      2018-01-02
    2   45      2018-01-27
    

    我需要使用partition by和row_number来分隔,其中一个日期和另一个日期之间的差异大于5天。类似这样的事情可能是上述示例的结果:

    ROWNUMBER   ID  NUMBER  DATE
    -----------------------------
    1           1   45      2018-01-01
    2           2   45      2018-01-02
    1           3   45      2018-01-27
    

    我的实际查询是这样的:

    SELECT ROW_NUMBER() OVER(PARTITION BY NUMBER ODER BY ID DESC) AS ROWNUMBER, ...

    但正如你所注意到的,这对约会不起作用。我怎样才能做到?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Yogesh Sharma    6 年前

    你可以用 lag 功能:

    select *, row_number() over (partition by number, grp order by id) as [ROWNUMBER]
    from (select *, (case when datediff(day, lag(date,1,date) over (partition by number order by id), date) <= 1 
                          then 1 else 2 
                     end) as grp
          from table
         ) t;
    
        2
  •  1
  •   Gordon Linoff    6 年前

    我想你想确定 ,使用 lag() datediff() 一笔累积的金额。 那么 使用 row_number() :

    select t.*,
           row_number() over (partition by number, grp order by date) as rownumber
    from (select t.*,
                 sum(grp_start) over (partition by number order by date) as grp
          from (select t.*,
                       (case when lag(date) over (partition by number order by date) < dateadd(day, 5, date)
                                then 1 else 0
                        end) as grp_start
                from t
               ) t
         ) t;
    
        3
  •  1
  •   Zaynul Abadin Tuhin    6 年前

    通过使用 lag datediff 功能

    select * from
        (
        select t.*,
               datediff(day,
                        lag(DATE) over (partition by NUMBER order by id),
                        DATE
                       ) as diff
        from  t 
          ) as TT where  diff>5
    

    http://sqlfiddle.com/#!18/130ae/11