2011-03-01 7 views
6
CREATE TABLE doctor(patient CHAR(13), docname CHAR(30)); 

Digamos que tenía una tabla como esta, ¿cómo podría mostrar los nombres de los médicos que tienen más pacientes? Como si la mayoría fueran tres y dos médicos tuvieran tres pacientes, mostraría sus nombres.SQL - Mostrando las entradas que son el máximo de un conteo?

Este obtendría los pacientes max:

SELECT MAX(count) 
FROM (SELECT COUNT(docname) FROM doctor GROUP BY docname) a; 

esto es todos los médicos y el número de pacientes que tienen:

SELECT docname, COUNT(docname) FROM doctor GROUP BY name; 

Ahora no puedo encontrar la manera de combinarlos para listar solo los nombres de los doctores que tienen el máximo de pacientes.

Gracias.

+3

¿Qué producto de base de datos y la versión? – Thomas

+0

Es difícil ayudar sin saber con qué base de datos estamos trabajando, como sugirió @Thomas. –

+1

¿Usted nombró a su tabla de pacientes como "autor"? ¿Cómo se ve el esquema de la tabla "paciente"? – Thomas

Respuesta

0

Tome ambas consultas y unirlas para obtener el máximo:

SELECT 
     docName, 
     m.MaxCount 
    FROM 
     author 
    INNER JOIN 
    (
     SELECT 
      MAX(count) as MaxCount, 
      docName 
     FROM 
      (SELECT 
        COUNT(docname) 
      FROM 
        doctor 
      GROUP BY 
        docname 
      ) 
    ) m ON m.DocName = author.DocName 
4

Esto debería bastar para usted:

SELECT docname 
FROM doctor 
GROUP BY docname 
HAVING COUNT(patient)= 
    (SELECT MAX(patientcount) FROM 
     (SELECT docname,COUNT(patient) AS patientcount 
     FROM doctor 
     GROUP BY docname) t1) 
+0

Me gusta mucho esta. Esto es más como lo que estaba tratando de hacer, excepto que estaba usando una cláusula where. Simplemente no pude entender bien el formato. – Stewage

2

Aquí hay otra alternativa que sólo tiene una subconsulta en lugar de dos:

SELECT docname 
FROM author 
GROUP BY name 
HAVING COUNT(*) = (
    SELECT COUNT(*) AS c 
    FROM author 
    GROUP BY name 
    ORDER BY c DESC 
    LIMIT 1 
) 
2

Permitir cualquier característica en cualquier especificación ISO SQL ya que no especificó y un producto de base de datos o la versión, y suponiendo que la tabla de los pacientes se llama "pacientes" y tiene una columna llamada "docname", lo siguiente podría darle lo que quería:

With PatientCounts As 
    (
    Select docname 
     , Count(*) As PatientCount 
    From patient 
    Group By docname 
    ) 
    , RankedCounts As 
    (
    Select docname, PatientCount 
     , Rank() Over(Order By PatientCount) As PatientCountRank 
    From PatientCounts 
    ) 
Select docname, PatientCount, PatientCountRank 
From RankedCounts 
Where PatientCountRank = 1 
11

Esto debe hacerlo.

SELECT docname, COUNT(*) FROM doctor GROUP BY name HAVING COUNT(*) = 
    (SELECT MAX(c) FROM 
     (SELECT COUNT(patient) AS c 
     FROM doctor 
     GROUP BY docname)) 

Por otro lado, si usted requiere sólo la primera entrada, luego

SELECT docname, COUNT(docname) FROM doctor 
GROUP BY name 
ORDER BY COUNT(docname) DESC LIMIT 1; 
0

Durante el uso ... ¿Tiene COUNT (*) = (... MAX() ..) funciona:

  • Dentro de la consulta, necesita casi la misma sub consulta dos veces.
  • Para la mayoría de las bases de datos, necesita una subconsulta de segundo nivel ya que MAX (COUNT (*)) no es compatible.

Durante el uso de TOP/LIMIT/RANK etc funciona:

  • Se utiliza extensiones de SQL para una base de datos específica.

Además, usar TOP/LIMIT de 1 solo dará una fila, ¿y si hay dos o más médicos con el mismo número máximo de pacientes?

Me romper el problema en pasos:

campo Get objetivo (s) y el recuento asociado

SELECT docName, COUNT(patient) AS countX 
FROM doctor 
GROUP BY docName 

Utilizando lo anterior como una, se unen para conseguir la 'declaración view con ámbito' fila max count (s)

WITH x AS 
(
    SELECT docName, COUNT(patient) AS countX 
    FROM doctor 
    GROUP BY docName 
) 
SELECT x.docName, x.countX 
FROM x 
INNER JOIN 
(
    SELECT MAX(countX) AS maxCountX 
    FROM x 
) x2 
ON x2.maxCountX = x.countX 

La cláusula WITH, que define un 'sco declaración ped view ', proporciona efectivamente subconsultas con nombre que pueden reutilizarse dentro de la misma consulta.

El JOIN coincide con la (s) fila (s) del recuento máximo de los pacientes.

Si bien esta solución, utilizando puntos de vista de los estados de ámbito, es más largo, que es:

  • fácil poner a prueba
  • autodocumentado
  • extensible

Es fácil poner a prueba como partes de la consulta se puede ejecutar de forma independiente.

Es auto documentado, ya que la consulta refleja directamente el requisito es decir, la vista del alcance de la declaración enumera el (los) campo (s) de destino y el recuento asociado.

Se puede extender como si se necesitaran otras condiciones o campos, esto se puede agregar fácilmente a la vista con ámbito de declaración. por ejemplo, en este caso, la estructura de la tabla debe cambiarse para incluir un id. De doctor como campo de clave principal y esto debería ser parte de los resultados.

0

Otra alternativa usando CTE:

with cte_DocPatients 
as 
(
select docname, count(*) as patientCount 
from doctor 
group by docname 
) 
select docname, patientCount from 
cte_DocPatients where 
patientCount = (select max(patientCount) from cte_DocPatients) 
Cuestiones relacionadas