Sql MongoDb中连续数据中的Groupin

Sql MongoDb中连续数据中的Groupin,sql,mongodb,grouping,Sql,Mongodb,Grouping,我在MongoDB中存储了点火时间数据(按ASC顺序),如: 1. **V_no** **Ign** **time** 2. 001 On 1536721212 3. 001 On 1536721213 4. 001 On 15367

我在MongoDB中存储了点火时间数据(按ASC顺序),如:

1. **V_no**              **Ign**           **time** 
2. 001                     On                 1536721212 
3. 001                     On                 1536721213
4. 001                     On                 1536721220
5. 001                     Off                1536721221
6. 001                     Off                1536721222 
7. 001                     On                 1536721234
8. 001                     On                 1536721256
9. 001                     Off                1536721299
我要寻找的是分组连续点火会话并输出如下:

1. **V_no**              **Ign**             **sTime**        **eTime**
2. 001                     On                 1536721212      1536721220
3. 001                     Off                1536721221      1536721222 
4. 001                     On                 1536721234      1536721256
5. 001                     Off                1536721299      1536721299
在R编程中,可以使用rleid(点火)对连续点火数据进行分组,如:


我希望在MongoDB或Mysql中使用相同类型的解决方案。

如果您有最新版本的Mysql,则可以使用
行号()


以下是MongoDB中对此的查询

//Populate the data
db.example.insert({v_no:'001',ign:'On',time:'1536721212'})
db.example.insert({v_no:'001',ign:'On',time:'1536721213'})
db.example.insert({v_no:'001',ign:'On',time:'1536721220'})
db.example.insert({v_no:'001',ign:'Off',time:'1536721221'})
db.example.insert({v_no:'001',ign:'Off',time:'1536721222'})
db.example.insert({v_no:'001',ign:'On',time:'1536721234'})
db.example.insert({v_no:'001',ign:'On',time:'1536721256'})
db.example.insert({v_no:'001',ign:'Off',time:'1536721299'})

var v_no = '',ign = '', stime = '', etime = '';
db.example.find().forEach(function(doc){
    if(v_no == doc.v_no && ign == doc.ign) {
        etime = doc.time;
    } else {
        if(v_no != null && v_no.length > 0) {
            db.example_output.updateOne({v_no:v_no,ign:ign,stime:stime},{$set:{etime:etime}});
        }
        v_no = doc.v_no;
        ign = doc.ign;
        stime = doc.time;
        etime = doc.time;
        db.example_output.insert({v_no:v_no,ign:ign,stime:stime,etime:etime})
    }
})

//to get the 'grouping consecutive ignition session'
db.example_output.find()

请注意,如果您有大量数据,此查询将非常昂贵。

您能解释一下吗?如果在mongodb中有任何方法,mysql中的任何解决方案,都是在sql server中
select v_no, ign, min(time), max(time)
from (select t.*, row_number() over (partition by v_no order by time) as seq1,
                  row_number() over (partition by v_no, ign order by time) as seq2
      from table t
     ) t
group by v_no, Ign, (seq1- seq2);
//Populate the data
db.example.insert({v_no:'001',ign:'On',time:'1536721212'})
db.example.insert({v_no:'001',ign:'On',time:'1536721213'})
db.example.insert({v_no:'001',ign:'On',time:'1536721220'})
db.example.insert({v_no:'001',ign:'Off',time:'1536721221'})
db.example.insert({v_no:'001',ign:'Off',time:'1536721222'})
db.example.insert({v_no:'001',ign:'On',time:'1536721234'})
db.example.insert({v_no:'001',ign:'On',time:'1536721256'})
db.example.insert({v_no:'001',ign:'Off',time:'1536721299'})

var v_no = '',ign = '', stime = '', etime = '';
db.example.find().forEach(function(doc){
    if(v_no == doc.v_no && ign == doc.ign) {
        etime = doc.time;
    } else {
        if(v_no != null && v_no.length > 0) {
            db.example_output.updateOne({v_no:v_no,ign:ign,stime:stime},{$set:{etime:etime}});
        }
        v_no = doc.v_no;
        ign = doc.ign;
        stime = doc.time;
        etime = doc.time;
        db.example_output.insert({v_no:v_no,ign:ign,stime:stime,etime:etime})
    }
})

//to get the 'grouping consecutive ignition session'
db.example_output.find()