如何在 MongoDB 中执行领先和滞后

Posted

技术标签:

【中文标题】如何在 MongoDB 中执行领先和滞后【英文标题】:How to perform lead and lag in MongoDB 【发布时间】:2022-01-17 03:39:33 【问题描述】:

我正在使用 STudio 3T,我有这样的查询:

select [Dashbo],lead([Dashbo]) over(order by [Entered Date])
from ATest_prevback;

这给了我和错误。如何在 MongoDB 中执行此操作?谁能举个例子?

谢谢, 阿迪

【问题讨论】:

【参考方案1】:

很遗憾,不可能。

解决方法:使用计算数据创建Materialized view。

在 MongoDB Shell 中运行:


var prev = null;
db.ATest_prevback.find().sort(field:1).forEach(function(curr)
    db.materialized_view.insert(curr:curr.field, prev:(prev ? prev.field : 0))
    prev = curr;
)

运行“假”leadlag 查询:

db.materialized_view.aggregate([
    $match:$expr:$eq:["$curr", "$prev"]
])

【讨论】:

【参考方案2】:

从MongoDB v5.0+开始,可以在$setWindowFields中使用$shift来完成。

db.collection.aggregate([
  
    "$setWindowFields": 
      "partitionBy": null,
      "sortBy": 
        "entered_date": 1
      ,
      "output": 
        lag: 
          $shift: 
            output: "$Dashbo",
            by: -1,
            default: "Not available"
          
        ,
        lead: 
          $shift: 
            output: "$Dashbo",
            by: 1,
            default: "Not available"
          
        
      
    
  
])

这里是Mongo playground 供您参考。

【讨论】:

以上是关于如何在 MongoDB 中执行领先和滞后的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:跨组(而不是组内)的领先/滞后分析功能

不同组的 Oracle SQL 领先滞后

明智地显示员工表部门的运行工资,而不使用滞后、领先或分区

当您将表格与公共列组合时重叠日期逻辑 - 领先或滞后

“Unnest”重叠时间间隔

ARIMA模型用于某些滞后