varios varias tablas son sirven registros que promedio para operadores nativas las funciones contar consulta clausulas campos agrupar agregado agregada agregacion sql oracle distinct

son - sql contar registros de varias tablas



Oracle 11g SQL para obtener valores Ășnicos en una columna de una consulta de varias columnas (6)

Eric Petroelje casi tiene razón:

SELECT * FROM TableA WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )

Nota: utilizando ROWID (ID de fila única), no ROWNUM (lo que da el número de fila dentro del conjunto de resultados)

Dada una tabla A de personas, su idioma nativo y otras columnas C3 .. C10 representadas por ...

Tabla a

PERSON LANGUAGE ... bob english john english vlad russian olga russian jose spanish

¿Cómo construyo una consulta que selecciona todas las columnas de una fila para cada idioma distinto?

Resultado deseado

PERSON LANGUAGE ... bob english vlad russian jose spanish

No me importa qué fila de cada idioma distinto hace el resultado. En el resultado anterior, elegí el número de fila más bajo de cada idioma.


Esto será más eficiente, además, tendrá control sobre el pedido que utiliza para elegir un valor:

SELECT DISTINCT FIRST_VALUE(person) OVER(PARTITION BY language ORDER BY person) ,language FROM tableA;

Si realmente no le importa qué persona es elegida para cada idioma, puede omitir la cláusula ORDER BY:

SELECT DISTINCT FIRST_VALUE(person) OVER(PARTITION BY language) ,language FROM tableA;


Mi Oracle está un poco oxidado, pero creo que esto funcionaría:

SELECT * FROM TableA WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )


Por el bien de la eficiencia, solo desea golpear los datos una vez, como lo hace Harper. Sin embargo, no desea utilizar rank () porque le dará vínculos y, además, desea agrupar por idioma en lugar de ordenar por idioma. Desde allí, desea agregar una cláusula orden por a otra para distinguir las filas, pero no desea ordenar los datos. Para lograr esto yo usaría "ordenar por nulo" Ej.

contar (*) más (orden de grupo por idioma por nulo)


Usaría la función RANK () en una subselección y luego solo tiraría de la fila donde rango = 1.

select person, language from ( select person, language, rank() over(order by language) as rank from table A group by person, language ) where rank = 1


select person, language from table A group by person, language

devolverá filas únicas