2013-04-22 6 views
5

Ben BusinessDataDate düzenlediği verileri tutan SQL Server bir tablo var. BusinessDataDate yalnızca bir Tarihtir (zaman bileşeni yoktur) ve yalnızca İş günlerinde doldurulur. Örneğin. Hafta sonları veya resmi tatil günleri değil.SQL'de "sonraki ama bir yeni" tarihini bulmanın en iyi yolu nedir?

özel bir sıra buna olmadığından, ben bu sorgu çalışır date before the current max date

bulmak istiyorum, ve yerel değişkenlere değerler ayarlayabilirsiniz - ama daha temiz bir yolu olmalı gibi geliyor?

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

Her tarih tablosunda birden fazla satır olacak - tam sayısı tahmin edilemez.

+2

Kişisel yaklaşım gayet iyi. Yalnızca son x günlerde filtrelemek için hem ana hem de alt sorgu için bir ekleme cümlesi eklemek performansı artırabilir. –

+0

Bunu deneyebilirim ... ancak Orta Doğu'da çalışmak, tahmin etmek için biraz belirsiz. Bayram 3-6 gün olabilir ve hafta sonları ile çakışırsa, o zaman etkili bir şekilde 10 günlük bir aralığa sahip olabilirsiniz. – BlueChippy

cevap

2

Orijinal sorgunuza benzer, ancak ilk 1'i kullanmaya ne dersiniz?

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

Sen Doğru tespit dış sorguda –

+0

tarihinde SİPARİŞ BY gerekir! Değişik. – Ric

+0

Nasıl daha iyi olur? Bu sıralama gerektirir ve orijinal sorgulamayacaktır. – 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

Geçersiz sütun adı 'x'. – BlueChippy

+0

Söylemeliyiz - tabloda birden çok satır var - tam satır sayısı tarih başına farklılık gösterir. – BlueChippy

+0

@BlueChippy: o zaman spesifik olun, reddetmeyin. biz ** – gbn