2013-04-22 6 views
5

Mam tabelę w SQL Server, który przechowuje dane organizowane przez BusinessDataDate. BusinessDataDate to tylko data (brak komponentu czasowego) i jest wypełniany tylko w dni robocze. na przykład nie w weekendy ani święta.Jaki jest najlepszy sposób na znalezienie daty "następny, ale jeden najnowszy" w SQL?

Ponieważ nie ma konkretnego celu, chcę znaleźć date before the current max date

Ta kwerenda działa i mogę ustawić wartości do zmiennych lokalnych - ale wydaje się, jakby nie musi być bardziej przejrzysty sposób?

SELECT MAX(BusinessDataDate) FROM myTable 
    WHERE BusinessDataDate < (SELECT MAX(BusinessDataDate) FROM myTable) 

Każda data ma wiele wierszy w tabeli - dokładna liczba nie jest przewidywalna.

+2

Twoje podejście jest w porządku. Dodanie klauzuli where do głównej i podkwerendy, aby filtrować tylko przez ostatnie x dni, może poprawić wydajność. –

+0

Mogę spróbować tego ... jednakże, praca na Bliskim Wschodzie jest trochę niejasna do odgadnięcia. Eid może trwać od 3 do 6 dni, a jeśli zbiega się z weekendami, to z rozmysłem możesz mieć 10-dniowy zakres. – BlueChippy

Odpowiedz

2

Podobny do twojego pierwotnego zapytania, ale co powiesz na korzystanie z pierwszej strony?

SELECT Top 1 BusinessDataDate 
FROM myTable 
WHERE BusinessDataDate < (SELECT MAX(BusinessDataDate) FROM myTable) 
ORDER BY BusinessDataDate DESC 
+0

Będziesz potrzebować ORDER BY na zewnętrznej kwerendzie –

+0

Dobrze zauważony! Zmieniono. – Ric

+0

Jak jest lepiej? Będzie to wymagało sortowania, a oryginalne zapytanie nie. – Aryadev

3
SELECT TOP (1) 
    BusinessDataDate 
FROM 
    (
    SELECT 
     BusinessDataDate, 
     DENSE_RANK() OVER (ORDER BY BusinessDataDate DESC) as rn 
    FROM 
     myTable 
    ) x 
WHERE 
    x.rn = 2 
ORDER BY 
    x.BusinessDataDate; 
+0

Nieprawidłowa nazwa kolumny "x". – BlueChippy

+0

Powinienem powiedzieć - w tabeli jest wiele wierszy - dokładna liczba wierszy różni się w zależności od daty. – BlueChippy

+0

@ BlueChippy: bądź konkretny, nie odrzucaj. Łatwo naprawiono, jeśli ** znaliśmy ** – gbn

Powiązane problemy