【发布时间】: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