Abfrage, um das nächstgelegene kleinere Datum zu finden

8

Ich habe einen Tisch mit Preisen. Jeder Tarif hat ein effektives Startdatum. (Das Enddatum eines jeden Kurses wird durch das Vorhandensein eines Datensatzes mit einem neueren effektiven Startdatum impliziert.) Ich habe auch eine Tabelle mit Aktivitäten. Jede Aktivität findet an einem Datum statt.

Was ist der beste Weg, um eine Aktivität an die Rate anzupassen, die an diesem Datum wirksam war?

(Leider kann ich die Datenstruktur nicht ändern, daher ist das Hinzufügen eines expliziten Enddatums für eine Rate nicht möglich.)

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
Hellion
quelle

Antworten:

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
          ) ;

oder eine GROUP BYLösung:

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 ;
ypercubeᵀᴹ
quelle