SQL - SELECCIONAR MAX(COUNT(*))

 
Vista:

SELECCIONAR MAX(COUNT(*))

Publicado por Alejandro (5 intervenciones) el 09/07/2012 11:58:55
Hola buenos días.

Estoy intentado hacer unos ejercicios de SQL, pero me he atascado con uno que a priori, no parece complicado.

Tengo una tabla con dos columnas, una es ID y la otra version, y necesito sacar la version que más ID tiene.

No soy capaz de hacerlo, siempre cuando intento utilizar en algún sitio MAX(COUNT(*)) siempre me dice que no se puede realizar esa consulta.

Alguien me puede dar alguna idea de como hacerlo, tengo hecho esto, ero evidentemente falla:

SELECT version
FROM SOPORTA
WHERE EXISTS (SELECT numversion, MAX(COUNT(numversion)) AS CONTADOR
FROM SOPORTA
GROUP BY numversion)

Muchas gracias.

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

SELECCIONAR MAX(COUNT(*))

Publicado por leonardo_josue (1173 intervenciones) el 09/07/2012 17:31:53
Hola Alejandro...

Lo que pretendes hacer es imposible, ya que tanto MAX como COUNT son funciones de agrupación y por tanto no pueden ser anidadas (no por lo menos de la manera en que lo estás queriendo hacer). Tengo algunas dudas de cómo tienes tu información almacenada, sería conveniente que nos pusieras algunos datos de ejemplo para darte una mejor respuesta, una duda sería si la agrupación la deberías hacer por el campo ID y no por el campo numversion, pero te repito, esto depende de como tengas almacenada tu información. Por lo pronto, lo que quieres hacer lo puedes hacer con una subconsulta, más o menos así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
mysql> SELECT * FROM soporta;
+------+---------+
| id   | version |
+------+---------+
|    1 | 1.0     |
|    1 | 1.1     |
|    1 | 1.2     |
|    2 | 1.0     |
|    2 | 1.1     |
|    2 | 1.2     |
|    2 | 1.3     |
|    3 | 1.0     |
|    3 | 1.1     |
+------+---------+
9 rows in set (0.00 sec)
 
mysql> SELECT id, COUNT(id) contador
    -> FROM soporta
    -> GROUP BY id;
+------+----------+
| id   | contador |
+------+----------+
|    1 |        3 |
|    2 |        4 |
|    3 |        2 |
+------+----------+
3 rows in set (0.00 sec)
 
mysql> SELECT MAX(contador) FROM
    -> ( SELECT id, COUNT(id) contador
    ->   FROM soporta
    ->   GROUP BY id ) T;
+---------------+
| MAX(contador) |
+---------------+
|             4 |
+---------------+
1 row in set (0.00 sec)


Observa que la subconsulta (consulta dentro de los paréntesis) obtiene sólo el COUNT de las versiones, con ese resultado se hace un select externo para obtener el MAX. Prueba y nos comentas si te sirve.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por Alejandro (5 intervenciones) el 09/07/2012 17:55:32
Muchas gracias por tu tiempo Leo.

La base de datos tiene almacenado los campos como los has puesto.

La consulta, es lo que has puesto, pero lo que tiene que devolver, no es el contador, es la ID que más versiones soporta. Supongo que algo así, pero no me funciona:

1
2
3
4
5
SELECT numversion FROM
      ( SELECT id, COUNT(id) contador
        FROM soporta
        GROUP BY id )
WHERE MAX(contador)


Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por Alejandro (5 intervenciones) el 09/07/2012 18:08:34
Perdón, que se me va entre los nombres de un sitio y de otro:

1
2
3
4
5
SELECT id FROM
      ( SELECT id, COUNT(id) contador
        FROM soporta
        GROUP BY id )
WHERE MAX(contador)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por Alejandro (5 intervenciones) el 09/07/2012 18:52:40
Vale, creo que se por donde van los tiros, en la cláusula where tampoco puedo poner una agrupoación, tengo que hacer varias subconsultas, pero me falla la sintaxis y no se donde.

[code]
SELECT id FROM
(SELECT id, MAX(contador) FROM
(SELECT id, OUNT(id) contador
FROM soporta
GROUP BY id)
GROUP BY id)

/code]

En el código que has puesto Leo, al final pones "GROUP BY id ) T;" que significa en T; es necesario porque sino no deja ejecutar, pero no encuentro en ningún manual nada referente a ello

Muchas gracias. Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por Alejandro (5 intervenciones) el 09/07/2012 19:55:34
Ya lo he conseguido, dejo el código por si a alguien le sirve:

1
2
3
4
5
6
7
8
9
SELECT id
FROM (SELECT id, COUNT(id) contador
	  FROM SOPORTA
	  GROUP BY id) AS T1
WHERE contador IN (SELECT MAX(contador)
				   FROM (SELECT id, COUNT(id) contador
				         FROM SOPORTA
				         GROUP BY id) AS T2
			 )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

SELECCIONAR MAX(COUNT(*))

Publicado por leonardo_josue (1173 intervenciones) el 09/07/2012 21:34:25
Hola de nuevo Alejandro...

Como ya te habrás dado cuenta, no es posible hacer un WHERE MAX()... para utilizar funciones de agrupación y filtrar tus datos tienes que hacerlo en la sección HAVING... Sería así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT id
    -> FROM soporta
    -> GROUP BY id
    -> HAVING COUNT(*) = ( SELECT MAX(contador) max_contador
    ->                     FROM ( SELECT id, COUNT(*) contador
    ->                            FROM soporta GROUP BY id
    ->                          ) T
    ->                   );
+------+
| id   |
+------+
|    2 |
+------+
1 row in set (0.00 sec)


Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por Cristina Murguia (2 intervenciones) el 13/03/2013 01:10:09
Me sirvio de mucho para una consulta que tenia que hacer .
muchas muchas gracias!!!

saludos!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

SELECCIONAR MAX(COUNT(*))

Publicado por Rodrigo (2 intervenciones) el 18/05/2013 19:02:56
Muy buenas
Estoy haber si saco un ejercicio que nos ha propuesto mi profesor en el que no encuentro la solucion y tiene que ver mucho con este hilo

La cuestión esta en que tengo una tabla con una sola columna de la nota de varios alumnos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> select Nota from Notas;
+------+
| Nota |
+------+
|    5 |
|    4 |
|    2 |
|    7 |
|    3 |
|    0 |
|    1 |
|    4 |
|    8 |
|    0 |
|    2 |
|    7 |
|    5 |
|   10 |
|    5 |
|    5 |
|    6 |
|    0 |
|    0 |
|    0 |
|    0 |
+------+
21 rows in set (0.00 sec)
Debo de sacar la nota que mas se repite que en este caso es el 0 (6 repeticiones) sin utilizar ni la clausula GROUP BY ni HAVING

Mi intento es:
1
2
mysql> select count(Nota) from Notas where count(Nota) in (select Nota from Notas where Nota=max(Nota));
ERROR 1111 (HY000): Invalido uso de función en grupo

Pero como veis no es asi.
Agradeceria enormemente la rapidez con que alguien me pudiera hechar una mano ya que conseguiria una notaza en la evaluación
Muchas gracias espero respuesta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

SELECCIONAR MAX(COUNT(*))

Publicado por Rodrigo (2 intervenciones) el 20/05/2013 20:57:28
¿Puede ser que nos este tomando el pelo y finalmente no se pueda??
Esque llevo ya un tiempo intentandolo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por Johnny (1 intervención) el 30/05/2013 18:22:34
Puede que lo que conteste sea un disparate total, pero hay una clausula que se puede usar con algunas funciones de agregado, la funcion case. No se si esté disponible en todas las bases, pero leer algo sobre eso no sobra
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por Luis Correa (1 intervención) el 15/12/2013 01:55:45
Muchas gracias excelente el codigo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por Marco (1 intervención) el 07/02/2018 20:48:33
Me puedes explicar que significa la "T" al final de la consulta y la palabra "contador " en la consulta having
¿de donde sacaste esos datos? (los que puse entre comillas)
Te lo agradeceria
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por Jorge (1 intervención) el 02/06/2021 09:10:35
Son las 2:10 de la mañana, llevo 5 horas con este error de mierda, desde el fondo de mi corazón, gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por José Cáserez (1 intervención) el 20/10/2014 08:00:44
Entre a este foro buscando alguna idea de como hacerlo, y al final se me ocurrió una bastante estúpida (alguna vez la use cuando aprendí SQL pero no la recordaba).
Aunque las soluciones posteadas funcionan, me parece que esta es mas simple ya que solo usa una función y nos ahorra las comparaciones. Se basa en mostrar el primer registro y usar el ordenamiento inverso. Luego extraemos el campo que nos interesa con un Select, teniendo la ventaja de que esto nos da mayor flexibilidad a la hora de usar el valor en cualquier lugar:

SELECT Id FROM(
SELECT TOP(1) Id, COUNT(*) AS Cant
FROM Tabla
GROUP BY Id
ORDER BY Cant DESC
) MaxRegistro

*Esto esta escrito para MSSQL, en otras BD se puede usar LIMIT 1 para mostrar el 1º registro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por Denisse (1 intervención) el 07/04/2015 17:28:14
tengo la sgt consulta SELECT MAX(bod_id)+1 as id FROM bodega quisiera presentar este resultado en una caja de texto en jsp me prodrian ayudar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SELECCIONAR MAX(COUNT(*))

Publicado por German (1 intervención) el 04/03/2016 03:26:42
Hola amigos esto les puede servir

1
2
3
4
5
6
7
8
9
10
11
12
select idempresa,Nombre,ObjVenta,count(IdVendedor) cantidad
 from empresa ,vendedor
 where IdEmpresa=Empresa
 group by IdEmpresa,Nombre,ObjVenta
 
 having count (IdVendedor) =(select max(can)
 
from (select count(IdVendedor)  as can
from Vendedor
group by Empresa)
 tabla
);


1
2
3
4
5
6
7
8
9
10
11
12
select idempresa,Nombre,ObjVenta,count(IdVendedor) cantidad
 from empresa inner join vendedor
 on IdEmpresa=Empresa
 group by IdEmpresa,Nombre,ObjVenta
 
 having count (IdVendedor) =(select max(can)
 
from (select count(IdVendedor)  as can
from Vendedor
group by Empresa)
 tabla
)

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar