如何在 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" },
}
},
..............
]
)
我正在尝试将 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" },
}
},
..............
]
)