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.