Interogare SQL pentru a calcula leadtime corectă în tabelul (MS Access)

voturi
1

Am următorul tabel: log(productId, status, statusDate, department...), în cazul în care productId, starea și statusDate este cheia primară. Exemplu:

ID1 01 01/01/2009
ID1 02 02/01/2009
ID1 03 03/01/2009
ID1 01 06/01/2009
ID1 02 07/01/2009
ID1 03 09/01/2009
ID2 01 02/01 / 2009
ID2 02 03/01/2009
ID2 01 04/01/2009
ID2 03 06/01/2009
ID3 01 03/01/2009
ID3 02 04/01/2009

vreau sa fac o interogare care preia pentru fiecare productId în status03, timpul care a trecut între prima dată a atins status01 și status03.Result așteptat:

ID1 2
ID1 3
ID2 4

Orice idee? Mulțumesc

Întrebat 12/03/2009 la 14:09
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
-3

Acest lucru ar lucra în SQL Server. Va trebui probabil să traducă părți din ea pentru acces:

SELECT l3.productID, DATEDIFF(d,COALESCE(l1.statusDate,l3.statusDate),l3.statusDate) AS LeadTime
FROM log l3
LEFT JOIN log l1 ON l1.productID=l3.productID AND l1.Status='01'
    AND l1.statusDate = 
      (
         SELECT TOP 1 statusDate 
         FROM log lsub 
         WHERE lsub.Status='01' AND lsub.productID=l1.productID AND l1.statusDate<l3.StatusDate
         ORDER BY statusDate DESC
      )
WHERE l3.Status='03'
Publicat 12/03/2009 la 14:27
sursa de către utilizator

voturi
2

Ce zici de:

SELECT t.ID, t.Status, t.SDateTime, 
    (SELECT Top 1 SDateTime 
     FROM t t1 WHERE t1.Status = 1 
     AND t1.ID=t.ID 
     AND t1.SDateTime<t.SDateTime 
     AND t1.SDateTime>=
         Nz((SELECT Top 1 SDateTime 
             FROM t t2 
             WHERE t2.Status=3 
             AND t2.ID=t.ID 
             AND t2.SDateTime<t.SDateTime),0)) AS DateStart, 
[SDateTime]-[DateStart] AS Result
FROM t
WHERE t.Status=3
Publicat 12/03/2009 la 15:12
sursa de către utilizator

voturi
1

Îmi place chestii de genul asta. Se pare că e mai complicat decât au sugerat oricare dintre celelalte două răspunsuri până acum. Iată o soluție care va funcționa. Scuzele mele pentru formatarea urât. De asemenea, acest lucru se va lucra în SQL Server, dar nu am folosit de acces în totdeauna, astfel încât să fie nevoie să ajustați acest lucru un pic pentru a lucra acolo. Sau poate să nu funcționeze deloc dacă accesul nu acceptă non-equijoins.

SELECT productId, MAX(tbl.TimeBetween)
FROM
 (SELECT status_1.productId as productId, status_1.statusDate as status1Date, MIN(status_3.statusDate) as status3Date, DATEDIFF(m,status_1.statusDate, MIN(status_3.statusDate)) as TimeBetween
  FROM 
  (SELECT productId, status, statusDate
    FROM log
    WHERE status = '01') status_1
  INNER JOIN
  (SELECT productId, status, statusDate
   FROM log
   WHERE status = '03') status_3
  ON status_1.productId = status_3.productId AND status_3.statusDate > status_1.statusDate
  GROUP BY status_1.productId, status_1.statusDate) tbl
GROUP BY productId, status3Date
ORDER BY productId, TimeBetween
  1. Selectează cel mai intim obține înregistrările pentru fiecare stare.
  2. Acestea sunt apoi unite pentru a da „03“ înregistrările de stare care nu sunt mai mari decât înregistrările lor „01“ corespunzătoare (cât de des ajungi să utilizați un non-equijoin?)
  3. Ele sunt apoi filtrate pentru a da MIN „03“, care este încă recordul după înregistrarea corespunzătoare „01“.
  4. Ultraperiferice Select impune dvs. „prima dată când a ajuns la«»regula de stare“ 01, deoarece aceasta poate merge la statutul de „01“ de mai multe ori înainte de a ajunge la statutul de „03“.

Dacă cineva are o soluție mai elegantă, mi-ar plăcea să-l văd. Am avut de a scrie interogări similare cu acest lucru în trecut, și mi-ar plăcea să văd o soluție mai bună pentru acest tip de problemă.

Publicat 12/03/2009 la 16:03
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more