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