2012-05-08 11 views
7

Ok, así que tengo una tabla en la que UNA de las columnas tiene unos pocos registros REPETIDOS.Necesita seleccionar TODAS las columnas mientras utiliza COUNT/Group By

Mi tarea consiste en seleccionar los registros REPETITIVOS con todos los atributos.

CustID NO AP DOB Ciudad Estado

la DOB tiene algunos valores que se repiten que necesito para seleccionar de toda la tabla y la lista de todas las columnas de todos los registros que se encuentran dentro del campo mismo DOB ​​..

Mi tratar ...

Select DOB, COUNT(DOB) As 'SameDOB' from Table1 

group by DOB 

HAVING (COUNT(DOB) > 1) 

Esto sólo devuelve dos columnas y una fila primera columna es la columna de la fecha de nacimiento que ocurre más de una vez y la segunda columna da cuenta de la cantidad.

tengo que encontrar una manera de hacer una lista de todos los atributos no sólo estos dos ...

favor me guía en la dirección correcta.

+0

solo tiene que enumerarlos todos en el 'SELECT' y no olvide incluirlos en' GROUP BY'. ¿Me estoy perdiendo de algo? ¿Lo intentó y no le da el resultado que espera? –

+0

@PavelVeller: normalmente, sí, agrupa por trabajos, pero cuando intenta encontrar duplicados, el grupo por todos los campos solo encontrará los recuentos en las distintas filas, por lo que el recuento debe colocarse dentro de una subconsulta o CTE. –

Respuesta

13

creo que una solución más general es utilizar ventanas funciones:

select * 
from (select *, count(*) over (partition by dob) as NumDOB 
     from table 
    ) t 
where numDOB > 1 

La razón esto es más general porque es fácil cambiar a duplicados en dos o más columnas.

+0

necesidad de leer en uno más cosa ... partición. Gracias ... Aprendiendo mucho esta noche. –

9
Select * 
FROM Table1 T 
WHERE T.DOB IN(Select I.DOB 
       FROM  Table1 I 
       GROUP BY I.DOB 
       HAVING COUNT(I.DOB) > 1) 
+1

El uso de la cláusula 'IN' contra una subconsulta puede ser bastante lento, solo un FYI. –

+0

También tenga en cuenta que olvidó su cláusula FROM en la subconsulta ... –

+1

@ChrisGessler. Se solucionó el problema, pero no estoy seguro de que 'IN' sea más lento. – gdoron

4

Trate de unirse con una subconsulta, que también le permitirá ver el recuento

select t.*, a.SameDOB from Table1 t 
join (
    Select DOB, COUNT(DOB) As 'SameDOB' from Table1 
    group by DOB 
    HAVING (COUNT(DOB) > 1) 
) a on a.dob = t.dob 
+0

Ahh ... eso funciona. Sigo siendo un novato en lo que respecta a la subconsulta. Creo que necesito enfocarme en eso realmente difícil en los próximos días.Necesito encontrar un libro que lo cubra con todo detalle. –

+0

@JohnSmith - MSDN es una buena lectura cuando tienes tiempo libre. –

+0

Ahora la otra parte es, encuentre el busto más joven y enumere todos los bustos con ese DOB. En otras palabras, tendré POR LO MENOS un registro en la entidad con todos los atributos .... –

-1
select * 
from table1, (select count(*) from table1) as cnt 
+1

Por favor, dé su Código con la explicación adecuada. Las respuestas de solo código no son apreciadas. –

Cuestiones relacionadas