【问题标题】:How to do SQL Server GROUP BY and ROW_NUMBER() subqueries in MongoDB如何在 MongoDB 中执行 SQL Server GROUP BY 和 ROW_NUMBER() 子查询
【发布时间】:2020-09-30 00:47:23
【问题描述】:

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

SQL Server 中的最终查询如下所示。这个查询有子查询,由于这个原因以及使用 ROW_NUMBER () 来获得预期的结果,我无法在 MongoDb 中复制相同的结果。

完整的 SQL Server 查询


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分组。

我想获得的帮助是如何将字段“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
}

感谢大家的帮助,很抱歉发了这么长的帖子。

【问题讨论】:

    标签: sql-server mongodb mongodb-query subquery aggregate


    【解决方案1】:

    您需要在两个 $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" },                    
                }
            }, 
            ..............
        ]
    )
    

    【讨论】:

    • 效果很好!
    猜你喜欢
    • 2011-12-10
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    相关资源
    最近更新 更多