Mysql 用于获取以日期间隔分隔的结果的查询 身份证件 时间戳 1. 2020-01-01 12:00:00 2. 2020-02-01 12:00:00 3. 2020-05-01 12:00:00 4. 2020-06-01 12:00:00 5. 2020-07-01 12:00:00

Mysql 用于获取以日期间隔分隔的结果的查询 身份证件 时间戳 1. 2020-01-01 12:00:00 2. 2020-02-01 12:00:00 3. 2020-05-01 12:00:00 4. 2020-06-01 12:00:00 5. 2020-07-01 12:00:00,mysql,sql,Mysql,Sql,您可以使用lag(),然后使用逻辑来查看差距是否足够大,以便开始一组新的记录。累积总和可为您提供所需的组: select t.*, sum(case when prev_timestamp >= timestamp - interval 1 month then 0 else 1 end) over (order by timestamp) as grouping from (select t.*, lag(timestamp) over (orde

您可以使用
lag()
,然后使用逻辑来查看差距是否足够大,以便开始一组新的记录。累积总和可为您提供所需的组:

select t.*,
       sum(case when prev_timestamp >= timestamp - interval 1 month then 0 else 1 end) over (order by timestamp) as grouping
from (select t.*,
             lag(timestamp) over (order by timestamp) as prev_timestamp
      from t
     ) t;
如果您想用开始和结束日期对其进行总结:

select min(timestamp), max(timestamp)
from (select t.*,
             sum(case when prev_timestamp >= timestamp - interval 1 month then 0 else 1 end) over (order by timestamp) as grouping
      from (select t.*,
                   lag(timestamp) over (order by timestamp) as prev_timestamp
            from t
           ) t
      ) t
group by grouping;
您可以使用
lag()
,然后使用逻辑来查看差距是否足够大,以便开始一组新的记录。累积总和可为您提供所需的组:

select t.*,
       sum(case when prev_timestamp >= timestamp - interval 1 month then 0 else 1 end) over (order by timestamp) as grouping
from (select t.*,
             lag(timestamp) over (order by timestamp) as prev_timestamp
      from t
     ) t;
如果您想用开始和结束日期对其进行总结:

select min(timestamp), max(timestamp)
from (select t.*,
             sum(case when prev_timestamp >= timestamp - interval 1 month then 0 else 1 end) over (order by timestamp) as grouping
      from (select t.*,
                   lag(timestamp) over (order by timestamp) as prev_timestamp
            from t
           ) t
      ) t
group by grouping;

例如,以下查询:

select group_concat(ID)
from (
  select w1.ID,w1.TS,w2.ID flag
  from work1 w1 left outer join work1 w2
  on timestampdiff(month,w2.TS,w1.TS)=1
  order by w1.ID
) w
group by
  case when flag is null then @str:=ID else @str end

例如,请参见以下查询:

select group_concat(ID)
from (
  select w1.ID,w1.TS,w2.ID flag
  from work1 w1 left outer join work1 w2
  on timestampdiff(month,w2.TS,w1.TS)=1
  order by w1.ID
) w
group by
  case when flag is null then @str:=ID else @str end

请参见

如果您向我们展示一些方法,我们可以告诉您哪种方法最好。请看:对我来说,这似乎不是一个非常简单的问题。不幸的是,我不能提供一个例子,因为我完全不知道从哪里开始,这就是为什么我来到这里,希望有人能给我指出正确的方向。但是你知道如何构造CREATE和INSERT语句,对吗?如果你告诉我们一些方法,我们可以告诉你哪一个是最好的。请看:对我来说,这似乎不是一个非常简单的问题。不幸的是,我不能提供一个例子,因为我完全不知道从哪里开始,这就是为什么我来到这里,希望有人能给我指出正确的方向。但是你知道如何构造CREATE和INSERT语句,对吗?