2011-12-21 14 views

Odpowiedz

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

czyli

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

czyli

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

Jeśli kolumna Date posiada unikalne wartości, wszystkie trzy pytania dadzą ten sam wynik. Jeśli kolumna może mieć zduplikowane daty, mogą dać inne wyniki (gdy są więzy na 1. lub 2. miejscu). Pierwsze zapytanie może nawet dać wiele wierszy w wyniku, jeśli na drugim miejscu znajdują się remisy.

+0

Wszystkie zwracają dwa rekordy, jeśli daty są takie same, jakiekolwiek rozwiązanie tego problemu? –

+0

Druga i trzecia kwerenda zawsze zwrócą 1 rekord lub brak. –

+0

To zależy od tego, jak chcesz radzić sobie z więzami. Co chcesz zwrócić, gdy wszystkie wiersze mają identyczne daty? –

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

powinien załatwić sprawę.

+0

kolejności malejącej według daty i będzie: D poza limitem nie jest w SQL 2008 ... ale szczyt. – xQbert

+3

Klauzula "LIMIT" nie jest obsługiwana w SQL Server. Zamiast tego użyj 'TOP'. http://msdn.microsoft.com/en-us/library/ms189463.aspx –

+0

Tak, dzięki za podpowiedź! Zmontowałem to. – Quasdunk

1

Proszę sprawdzić ten kod.

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

Prasad.

+1

'LIMIT' nie działa w ** SERWER SQL ** jest to składnia MySQL –

+0

Oh Sorry. Moja wina. Nie widziałem, który serwer SQL jest. Dzięki, że to zauważyłeś. –

1

wybierz przedostatni datą w sql:

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

nadzieja pomaga kogoś.

0

Spróbuj

SELECT * 
FROM Table 
WHERE Date = (SELECT MAX(Date) FROM Table 
      WHERE Date < (SELECT MAX(Date) FROM Table) 
     ) ; 
Powiązane problemy