2013-04-22 30 views
5

Tôi có một bảng trong SQL Server chứa dữ liệu được tổ chức bởi BusinessDataDate. BusinessDataDate là ngày chỉ (không có thành phần thời gian) và chỉ được điền vào ngày làm việc. ví dụ. không phải cuối tuần hoặc ngày lễ.Whats cách tốt nhất để tìm ngày "tiếp theo nhưng mới nhất" trong SQL?

Vì không có thứ tự cụ thể để điều này, tôi muốn tìm date before the current max date

việc truy vấn này, và tôi có thể thiết lập các giá trị vào các biến địa phương - nhưng nó cảm thấy như có phải là một cách sạch hơn?

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

Mỗi ngày sẽ có nhiều hàng trong bảng - số chính xác không thể dự đoán được.

+2

Cách tiếp cận của bạn là tốt. Thêm mệnh đề where vào cả chính và truy vấn phụ để lọc chỉ trong x ngày qua có thể cải thiện hiệu suất. –

+0

Tôi có thể thử rằng ... tuy nhiên, làm việc ở Trung Đông một chút mơ hồ của nó để đoán. Eid có thể là 3-6 ngày, và nếu nó trùng với những ngày cuối tuần thì bạn có thể có một khoảng thời gian 10 ngày. – BlueChippy

Trả lời

2

Tương tự như truy vấn ban đầu của bạn nhưng cách sử dụng top 1 thì sao?

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

Bạn sẽ cần ORDER BY trên truy vấn bên ngoài –

+0

Cũng được phát hiện! Đã sửa đổi. – Ric

+0

Làm cách nào tốt hơn? Điều này sẽ yêu cầu sắp xếp, và truy vấn ban đầu sẽ không. – 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

Tên cột không hợp lệ 'x'. – BlueChippy

+0

Nên nói - có nhiều hàng trong bảng - số lượng hàng chính xác khác nhau theo ngày. – BlueChippy

+0

@BlueChippy: cụ thể sau đó, đừng downvote. Dễ dàng sửa nếu ** chúng tôi đã biết ** – gbn

Các vấn đề liên quan