एसक्यूएल तालिका में सही leadtime गणना करने के लिए क्वेरी (एमएस एक्सेस)

वोट
1

: मैं निम्न तालिका है log(productId, status, statusDate, department...), productId, स्थिति और statusDate प्राथमिक कुंजी है, जहां। उदाहरण:

ID1 01 2009/01/01
ID1 02 2009/02/01
ID1 03 2009/03/01
ID1 01 2009/06/01
ID1 02 2009/07/01
ID1 03 2009/09/01
आईडी 2 01 02/01 / 2009
आईडी 2 02 2009/03/01
आईडी 2 01 2009/04/01
आईडी 2 03 2009/06/01
id3 01 2009/03/01
id3 02 2009/04/01

मैं एक प्रश्न है कि status03 में प्रत्येक productId का पुन: प्राप्त करता बनाना चाहते, समय पहली बार यह status01 पर पहुंच गया और status03.Result की उम्मीद के बीच पारित किया है कि:

ID1 2
ID1 3
आईडी 2 4

किसी भी विचार? धन्यवाद

12/03/2009 को 16:09
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
2

कैसा रहेगा:

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
12/03/2009 को 17:12
का स्रोत उपयोगकर्ता

वोट
1

मुझे इस तरह की चीज पसंद है। ऐसा लगता है कि और अधिक जटिल की तुलना में अन्य दो जवाब के दोनों अब तक का सुझाव दिया है है। यहाँ एक समाधान है कि काम करता रहेगा। बुरा प्रारूपण के लिए मेरे क्षमायाचना। इसके अलावा, इस एसक्यूएल सर्वर में काम करेंगे, लेकिन मैं हमेशा के लिए में प्रवेश का उपयोग नहीं किया है, तो आप वहाँ काम करने के लिए यह एक बिट समायोजित करने की आवश्यकता हो सकती है। या यह सब पर अगर पहुँच गैर 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. अंतरतम चयन प्रत्येक स्थिति के लिए रिकॉर्ड मिलता है।
  2. उन फिर '03' का दर्जा रिकॉर्ड है कि उनके '01' इसी रिकॉर्ड से अधिक हैं देने के लिए शामिल हो गए हैं (कितनी बार आप एक गैर equijoin उपयोग करने के लिए मिलता है?)
  3. वे तो MIN '03' रिकॉर्ड इसी '01' रिकॉर्ड के बाद अब भी है कि देने के लिए फ़िल्टर किया जाता है।
  4. सबसे बाहरी का चयन अपने 'पहली बार यह पहुंच गया' 01 'का दर्जा नियम' के बाद से यह '03' का दर्जा तक पहुँचने से पहले '01' का दर्जा के लिए कई बार जा सकते हैं लागू करता है।

किसी और के लिए एक अधिक सुरुचिपूर्ण समाधान है, तो मैं इसे देखना अच्छा लगेगा। मैंने पहले भी इस के समान प्रश्नों लिखने के लिए पड़ा है, और मैं इस प्रकार की समस्या का एक बेहतर समाधान को देखने के लिए अच्छा लगेगा।

12/03/2009 को 18:03
का स्रोत उपयोगकर्ता

वोट
-3

यह Sql सर्वर में काम करेगा। आप की संभावना प्रवेश के लिए इसके कुछ हिस्सों का अनुवाद करना होगा:

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'
12/03/2009 को 16:27
का स्रोत उपयोगकर्ता

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