truy vấn để tìm ngày gần nhất


8

Tôi có một bảng với tỷ lệ. mỗi tỷ lệ có một ngày bắt đầu có hiệu lực. (ngày kết thúc của bất kỳ tỷ lệ nào được ngụ ý bởi sự tồn tại của một bản ghi với ngày bắt đầu có hiệu lực mới hơn.) Tôi cũng có một bảng với các hoạt động. Mỗi hoạt động xảy ra vào một ngày.

Cách tốt nhất để kết hợp một hoạt động với tỷ lệ có hiệu lực vào ngày đó là gì?

(thật không may, tôi không có khả năng sửa đổi cấu trúc dữ liệu, vì vậy việc thêm ngày kết thúc rõ ràng cho một tỷ lệ đã hết.)

rates:
StartDate Rate
9/1/2010    17.00
10/1/2010   18.70
11/1/2010   20.00

Activities:
WorkCenter  ActionDate Hours
WC1         9/30/2010   10
WC1         10/1/2010   5
WC2         10/30/2010  8
WC2         11/3/2010   9

Desired result:
Workcenter ActionDate   Hours   Rate    Cost(=rate*hours)
WC1         9/30/2010   10      17.00   170.00
WC1         10/1/2010   5       18.70    93.50
WC2         10/30/2010  8       18.70   149.60
WC2         11/3/2010   9       20.00   180.00

Câu trả lời:


11
SELECT 
    a.WorkCenter
  , a.ActionDate
  , a.Hours
  , r.Rate
  , r.Rate * a.Hours  AS Cost
FROM 
    Activities AS a
  JOIN
    Rates AS r
      ON  r.StartDate = 
          ( SELECT MAX(StartDate)
             FROM Rates 
             WHERE StartDate <= a.ActionDate
          ) ;

hoặc một GROUP BYgiải pháp:

SELECT 
    a.WorkCenter
  , a.ActionDate
  , a.Hours
  , r.Rate
  , r.Rate * a.Hours  AS Cost
FROM 
    Activities AS a
  JOIN
    ( SELECT 
          a.ActionDate
        , MAX(r.StartDate) AS StartDate
      FROM 
          Activities AS a
        JOIN
          Rates AS r
            ON r.StartDate <= a.ActionDate
      GROUP BY a.ActionDate
    ) AS grp
      ON  grp.ActionDate = a.ActionDate
 JOIN
    Rates AS r
      ON  r.StartDate = grp.StartDate ;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.