ver una tabla para informacion imprimir extraer estructura ejemplos definicion datos consultas consultar como comando codigo sql sql-server-2005 greatest-n-per-group

sql - una - Seleccione información de la tabla donde la fila tiene fecha máxima



ver codigo de una tabla sql server (4)

Mi mesa se ve así:

group date cash checks 1 1/1/2013 0 0 2 1/1/2013 0 800 1 1/3/2013 0 700 3 1/1/2013 0 600 1 1/2/2013 0 400 3 1/5/2013 0 200

- No necesita dinero en efectivo solo para demostrar que la mesa tiene más información en él

Quiero obtener cada grupo único donde la fecha es máxima y las verificaciones son mayores que 0. Entonces, la declaración sería algo así como:

group date checks 2 1/1/2013 800 1 1/3/2013 700 3 1/5/2013 200

código intentado:

SELECT group,MAX(date),checks FROM table WHERE checks>0 GROUP BY group ORDER BY group DESC

problema con eso es que me da todas las fechas y los controles en lugar de solo la fila de fecha máxima.

utilizando ms sql server 2005


Puede usar una window MAX () como esta:

SELECT *, max_date = MAX(date) OVER (PARTITION BY group) FROM table

para obtener las fechas máximas por group junto con otros datos:

group date cash checks max_date ----- -------- ---- ------ -------- 1 1/1/2013 0 0 1/3/2013 2 1/1/2013 0 800 1/1/2013 1 1/3/2013 0 700 1/3/2013 3 1/1/2013 0 600 1/5/2013 1 1/2/2013 0 400 1/3/2013 3 1/5/2013 0 200 1/5/2013

Usando el resultado anterior como una tabla derivada, puede obtener solo las filas donde la date coincida con max_date :

SELECT group, date, checks FROM ( SELECT *, max_date = MAX(date) OVER (PARTITION BY group) FROM table ) AS s WHERE date = max_date ;

para obtener el resultado deseado

Básicamente, esto es similar a la sugerencia de @ Twelfth pero evita una unión y puede ser más eficiente.

Puedes probar el método en SQL Fiddle .


puedes usar join así. Si usa IN, esto funcionará lento, intente evitarlo.

SELECT * FROM (SELECT msisdn, callid, Change_color, play_file_name, date_played FROM insert_log WHERE play_file_name NOT IN(''Prompt1'',''Conclusion_Prompt_1'',''silent'') ORDER BY callid ASC) t1 JOIN (SELECT MAX(date_played) AS date_played FROM insert_log GROUP BY callid) t2 ON t1.date_played=t2.date_played


SELECT group, date, checks FROM table WHERE checks > 0 GROUP BY group HAVING date = max(date)

Deberia trabajar.


SELECT group,MAX(date) as max_date FROM table WHERE checks>0 GROUP BY group

Eso funciona para obtener la fecha máxima ... únete a tus datos para obtener las otras columnas:

Select group,max_date,checks from table t inner join (SELECT group,MAX(date) as max_date FROM table WHERE checks>0 GROUP BY group)a on a.group = t.group and a.max_date = date

Funciones de unión interna como filtro para obtener el registro máximo solamente.

FYI, los nombres de tus columnas son horribles, no uses palabras reservadas para las columnas (grupo, fecha, tabla).