如何在 MongoDB 中执行 SQL 服务器 GROUP BY 和 ROW_NUMBER() 子查询

How to do SQL Server GROUP BY and ROW_NUMBER() subqueries in MongoDB

我正在尝试将 SQL 服务器的查询转换为 MongoDB 的查询。此时 table 和集合具有相同的数据和结构。

SQL 服务器中的最终查询如下所示。此查询具有子查询,因此以及使用 ROW_NUMBER () 获得预期结果我无法在 MongoDb.

中复制相同的结果

FULL SQL 服务器查询


SELECT CodigoNodo, NivelTension, cantidad
    FROM (
            SELECT *,
            ROW_NUMBER() OVER (PARTITION BY CodigoNodo ORDER BY cantidad DESC) AS Top_niveltesion
            FROM (
                    SELECT CodigoNodo, NivelTension,COUNT(NivelTension) as cantidad
                    FROM QEnergia.FronteraInstalaciones
                    WHERE IdentificadorEmpresa=1
                    GROUP BY CodigoNodo,NivelTension
                ) SubconsultaInterna  
        ) Subconsulta
    WHERE Top_niveltesion = 1
    ORDER BY CodigoNodo;

为了更容易理解结果,我在这里展示这部分查询的结果。

SELECT *,
            ROW_NUMBER() OVER (PARTITION BY CodigoNodo ORDER BY cantidad DESC) AS Top_niveltesion
            FROM (
                    SELECT CodigoNodo, NivelTension,COUNT(NivelTension) as cantidad
                    FROM QEnergia.FronteraInstalaciones
                    WHERE IdentificadorEmpresa=1
                    GROUP BY CodigoNodo,NivelTension
                ) SubconsultaInterna 

结果

+------------+--------------+----------+-----------------+
| CodigoNodo | NivelTension | cantidad | Top_niveltesion |
+------------+--------------+----------+-----------------+
|     100001 |            2 |       15 |               1 |
|     100001 |            4 |       13 |               2 |
|     100001 |            3 |       13 |               3 |
|     100001 |            1 |        7 |               4 |
|     100002 |            2 |       20 |               1 |
|     100002 |            1 |       14 |               2 |
|     100002 |            3 |       12 |               3 |
|     100002 |            4 |        9 |               4 |
|     100003 |            3 |       10 |               1 |
|     100003 |            2 |        9 |               2 |
|     100003 |            1 |        5 |               3 |
|     100003 |            4 |        4 |               4 |
|     100004 |            4 |        1 |               1 |
|     100005 |            4 |        7 |               1 |
|     100005 |            2 |        7 |               2 |
|     100005 |            3 |        4 |               3 |
|     100005 |            1 |        2 |               4 |
|     100006 |            3 |        9 |               1 |
|     100006 |            2 |        7 |               2 |
|     100006 |            4 |        1 |               3 |
+------------+--------------+----------+-----------------+

这是完整查询的最终结果

+------------+--------------+----------+
| CodigoNodo | NivelTension | cantidad |
+------------+--------------+----------+
|     100001 |            2 |       15 |
|     100002 |            2 |       20 |
|     100003 |            3 |       10 |
|     100004 |            4 |        1 |
|     100005 |            2 |        7 |
|     100006 |            3 |        9 |
|     100007 |            2 |       13 |
|     100008 |            2 |       20 |
|     100009 |            2 |       19 |
|      10001 |            3 |       15 |
|     100010 |            3 |       41 |
|     100011 |            3 |       22 |
|     100012 |            2 |       11 |
|     100013 |            2 |       20 |
|     100014 |            3 |       28 |
|     100015 |            2 |       15 |
|     100016 |            3 |       24 |
|     100017 |            2 |       37 |
|     100018 |            2 |       30 |
|     100019 |            3 |       22 |
+------------+--------------+----------+

这样我们看到最后的结果是得到了计算字段“cantidad”的最大值的记录,只是被CodigoNodo[=45]分组=].

我想获得的帮助是如何在最终结果中输入字段“NivelTension”的值,因为它不在分组中,而且我有无法在 MongoDB.

中复制它

目前这是我目前开发的查询。

db.getCollection("FronteraInstalaciones").aggregate(
    [
        {
            "$match" : { "IdentificadorEmpresa":1 }              
        },
        { 
            "$group" : { 
                "_id" : {                     
                    "CodigoNodo" : "$CodigoNodo", 
                    "NivelTension" : "$NivelTension"
                }, 
                "cantidad" : { 
                    $sum : 1
                }                                
            }
        },                  
        { 
            "$group" : { 
                "_id" : {                     
                    "CodigoNodo" : "$_id.CodigoNodo"
                }, 
                "maximo" : { $max : "$cantidad" }
            }
        }, 
        { 
            "$project" : { 
                "_id" : false,
                "CodigoNodo" : "$_id.CodigoNodo",                
                "Maximo" : "$maximo"                
            }
        }, 
        { 
            "$sort" : { 
                "CodigoNodo" : 1
            }
        }
    ],
    { 
        "allowDiskUse" : true
    }
);

我得到了这个正确的结果,但我无法显示与“Maximo”字段($max:“$cantidad”)相关的字段“NivelTension”,就好像它发生在 SQL 查询中。

{ 
    "CodigoNodo" : "100001", 
    "Maximo" : 15.0
}
{ 
    "CodigoNodo" : "100002", 
    "Maximo" : 20.0
}
{ 
    "CodigoNodo" : "100003", 
    "Maximo" : 10.0
}
{ 
    "CodigoNodo" : "100004", 
    "Maximo" : 1.0
}
{ 
    "CodigoNodo" : "100005", 
    "Maximo" : 7.0
}
{ 
    "CodigoNodo" : "100006", 
    "Maximo" : 9.0
}
{ 
    "CodigoNodo" : "100007", 
    "Maximo" : 13.0
}
{ 
    "CodigoNodo" : "100008", 
    "Maximo" : 20.0
}
{ 
    "CodigoNodo" : "100009", 
    "Maximo" : 19.0
}
{ 
    "CodigoNodo" : "10001", 
    "Maximo" : 15.0
}
{ 
    "CodigoNodo" : "100010", 
    "Maximo" : 41.0
}
{ 
    "CodigoNodo" : "100011", 
    "Maximo" : 22.0
}
{ 
    "CodigoNodo" : "100012", 
    "Maximo" : 11.0
}
{ 
    "CodigoNodo" : "100013", 
    "Maximo" : 20.0
}
{ 
    "CodigoNodo" : "100014", 
    "Maximo" : 28.0
}
{ 
    "CodigoNodo" : "100015", 
    "Maximo" : 15.0
}
{ 
    "CodigoNodo" : "100016", 
    "Maximo" : 24.0
}
{ 
    "CodigoNodo" : "100017", 
    "Maximo" : 37.0
}
{ 
    "CodigoNodo" : "100018", 
    "Maximo" : 30.0
}
{ 
    "CodigoNodo" : "100019", 
    "Maximo" : 22.0
}

谢谢大家的帮助,抱歉这么久 post。

您需要在两个 $group 阶段之间添加一个 $sort 阶段,如下所示。第二个 $group 使用 $first 累加器。

db.getCollection("FronteraInstalaciones").aggregate(
    [
        ................
        { 
            "$group" : { 
                "_id" : {                     
                    "CodigoNodo" : "$CodigoNodo", 
                    "NivelTension" : "$NivelTension"
                }, 
                "cantidad" : { 
                    $sum : 1
                }                                
            }
        }, 
        {
             "$sort":{
                "_id.CodigoNodo": 1,
                "cantidad": -1
            }
        },                 
        { 
            "$group" : { 
                "_id" : {                     
                    "CodigoNodo" : "$_id.CodigoNodo"
                }, 
                "NivelTension":{$first:"$_id.NivelTension"}
                "maximo" : { $max : "$cantidad" },                    
            }
        }, 
        ..............
    ]
)