Từ những gì tôi đọc, tôi giả sử rằng bạn muốn tất cả các công ty có trạng thái 1 trong phạm vi ngày của bạn. Nếu đây là những gì bạn muốn, điều đó khá dễ dàng.
Câu lệnh sau sẽ thực hiện công việc:
SELECT C.*
FROM COMPANY C
LEFT JOIN ( SELECT H.STATUS, H.COMPANY_ID
FROM COMPANYSTATUS H
WHERE H.STATUS_EFFECTIVE_DATE = (SELECT MAX(H1.STATUS_EFFECTIVE_DATE)
FROM COMPANYSTATUS H1
WHERE H1.COMPANY_ID = H.COMPANY_ID
AND H1.STATUS_EFFECTIVE_DATE <= '20171231'
) CH ON CH.COMPANY_ID = C.ID
WHERE ( C.STATUS = 1 AND CH.COMPANY_ID IS NULL ) -- CASE #1 : STATUS = 1 AND NEVER CHANGED (NO HISTORY)
OR H.STATUS = 1
Những gì tôi đã làm là tạo chế độ xem lồng nhau với trạng thái cuối cùng cho đến khi kết thúc phạm vi ngày của bạn, vì vậy nếu lần thay đổi cuối cùng của trạng thái công ty là 1 thì công ty này sẽ được đưa vào kết quả của bạn. Chúng tôi không quan tâm đến những thay đổi sau phạm vi ngày của bạn, vì vậy tôi đưa ra hạn chế bên trong chế độ xem lồng nhau.
Sự bắt đầu của phạm vi của bạn là không đáng kể đối với yêu cầu này. Bạn có thể cần cho các mục đích khác, để tham gia các bảng khác.
Tôi là người của Oracle, vì vậy tôi nghĩ Ι có thể làm cho câu lệnh này tốt hơn nhiều bằng cách sử dụng phân tích Oracle, nhưng tôi nghĩ nó sẽ là một câu lệnh hợp lệ cho máy chủ SQL.