varios valores valor seleccionar registros promedio obtener maximos maximo funciones ejemplos contar campos campo agrupamiento agrupados sql group-by max distinct min

valores - sql contar registros agrupados



SQL: agrupar por valor mínimo en un campo al seleccionar filas distintas (7)

Esta es una pregunta antigua, pero puede ser útil para alguien. En mi caso, no puedo usar una consulta secundaria porque tengo una consulta grande y necesito usar min () en mi resultado, si uso una consulta secundaria, la db necesita volver a ejecutar mi gran consulta. estoy usando mysql

select t.* from (select m.*, @g := 0 from MyTable m --here i have a big query order by id, record_date) t where (1 = case when @g = 0 or @g <> id then 1 else 0 end ) and (@g := id) IS NOT NULL

Básicamente, ordené el resultado y luego puse una variable para obtener solo el primer registro de cada grupo.

Esto es lo que estoy tratando de hacer. Digamos que tengo esta tabla t:

id | record_date | other_cols 18 | 2011-04-03 | x 18 | 2012-05-19 | y 18 | 2012-08-09 | z 19 | 2009-06-01 | a 19 | 2011-04-03 | b 19 | 2011-10-25 | c 19 | 2012-08-09 | d

Para cada ID, quiero seleccionar la fila que contiene el record_date mínimo. Así que obtendría:

id | record_date | other_cols 18 | 2011-04-03 | x 19 | 2009-06-01 | a

Las únicas soluciones que he visto para este problema suponen que todas las entradas de record_date son distintas, pero este no es el caso en mis datos. El uso de una subconsulta y una unión interna con dos condiciones me daría filas duplicadas para algunos ID, que no quiero:

id | record_date | other_cols 18 | 2011-04-03 | x 19 | 2011-04-03 | b 19 | 2009-06-01 | a


Esto lo hace simplemente:

select t2.id,t2.record_date,t2.other_cols from (select ROW_NUMBER() over(partition by id order by record_date)as rownum,id,record_date,other_cols from MyTable)t2 where t2.rownum = 1


La siguiente consulta toma la primera fecha de cada orden de trabajo (en una tabla donde se muestran todos los cambios de estado):

SELECT WORKORDERNUM, MIN(DATE) FROM WORKORDERS WHERE DATE >= to_date(''2015-01-01'',''YYYY-MM-DD'') GROUP BY WORKORDERNUM


Me gustaría agregar a algunas de las otras respuestas aquí, si no necesita el primer ítem pero diga el segundo número, por ejemplo, puede usar el número de rownumber en una subconsulta y basar su conjunto de resultados.

SELECT * FROM ( SELECT ROW_NUM() OVER (PARTITION BY Id ORDER BY record_date, other_cols) as rownum, * FROM products P ) INNER WHERE rownum = 2

Esto también le permite ordenar varias columnas en la subconsulta, lo que puede ayudar si dos record_dates tienen valores idénticos. También puede dividir varias columnas si es necesario delimitándolas con una coma


Para obtener el producto más barato en cada categoría, use la función MIN () en una subconsulta correlacionada de la siguiente manera:

SELECT categoryid, productid, productName, unitprice FROM products a WHERE unitprice = ( SELECT MIN(unitprice) FROM products b WHERE b.categoryid = a.categoryid)

La consulta externa explora todas las filas en la tabla de productos y devuelve los productos que tienen precios unitarios que coinciden con el precio más bajo en cada categoría devuelta por la subconsulta correlacionada.


Podría obtener el resultado esperado solo haciendo esto en mysql :

SELECT id, min(record_date), other_cols FROM mytable GROUP BY id

¿Esto funciona para tí?


Que tal algo como

SELECT mt.*, FROM MyTable mt INNER JOIN ( SELECT ID, MIN(Record_Date) MinDate FROM MyTable GROUP BY ID ) t ON mt.ID = t.ID AND mt.Record_Date = t.MinDate

Esto obtiene la fecha mínima por ID y luego obtiene los valores basados ​​en esos valores. La única vez que tendría duplicados es si hay fechas de registro mínimas duplicadas para la misma ID.