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).