2011-12-21 20 views

Respuesta

17
SELECT * 
FROM Table 
WHERE Date = (SELECT MAX(Date) 
       FROM Table 
       WHERE Date < (SELECT MAX(Date) 
           FROM Table 
          ) 
      ) ; 

o:

SELECT TOP (1) * 
FROM Table 
WHERE Date < (SELECT MAX(Date) 
       FROM Table 
      ) 
ORDER BY Date DESC ; 

o:

SELECT * 
FROM 
    (SELECT t.* 
     , ROW_NUMBER() OVER(ORDER BY Date DESC) AS RowNumber 
    FROM Table t 
) AS tmp 
WHERE RowNumber = 2 ; 

Si la columna de la Date tiene valores únicos, las tres consultas dará el mismo resultado. Si la columna puede tener fechas duplicadas, entonces pueden dar resultados diferentes (cuando hay empates en 1er o 2do lugar). La primera consulta incluso dará varias filas en el resultado si hay empates en el 2do lugar.

+0

Todos están devolviendo dos registros si las fechas son las mismas, ¿alguna solución para esto? –

+0

La segunda y tercera consulta siempre devolverán 1 registro o ninguno. –

+0

Por lo tanto, depende de cómo quiera lidiar con los vínculos. ¿Qué quieres que vuelva cuando todas las filas tienen fechas idénticas? –

7
"select TOP (1) * 
from Table 
WHERE Date<(SELECT MAX(Date) FROM Table) 
ORDER BY Date DESC" 

deberían hacer el truco.

+0

por fecha descendente y será: D excepto límite no está en SQL 2008 ... pero es superior. – xQbert

+3

La cláusula 'LIMIT' no es compatible con SQL Server. Use 'TOP' en su lugar. http://msdn.microsoft.com/en-us/library/ms189463.aspx –

+0

Sí, gracias por la pista. Lo he editado. – Quasdunk

1

Por favor, consulte este código.

SELECT * FROM category WHERE Created_Time <(SELECT MAX(Created_Time) FROM category) ORDER BY Created_Time DESC LIMIT 1 

Prasad.

+1

'LIMIT' no funciona en ** SQL SERVER ** es la sintaxis de MySQL –

+0

Oh Sorry. Mi culpa. No vi qué servidor SQL es. Gracias por notar eso –

1

seleccione segunda fecha pasada en SQL:

SELECT MAX(YourDateColumn) FROM YourTable where ColumnId=2 and YourDateColumn < 
(SELECT MAX(YourDateColumn) FROM YourTable where ColumnId=2) 

esperanza ayuda a alguien.

0

probar este fin

SELECT * 
FROM Table 
WHERE Date = (SELECT MAX(Date) FROM Table 
      WHERE Date < (SELECT MAX(Date) FROM Table) 
     ) ; 
Cuestiones relacionadas