محاكاة تأخير وظيفة في MySQL




sliding-window (2)

لتحقيق النتيجة المرجوة ، يجب أولاً العثور على آخر الطوابع الزمنية الأخيرة واللاحقة لكل شركة. الأمر بسيط للغاية مع الاستعلام التالي:

SELECT c.company, c.mts, max(l.ts) AS lts
  FROM (SELECT company, max(ts) AS mts FROM cq GROUP BY company) AS c
  LEFT JOIN cq l
    ON c.company = l.company AND c.mts > l.ts
 GROUP BY c.company, c.mts;

الآن عليك الانضمام إلى طلب البحث الفرعي هذا مع الجدول الأصلي للحصول على النتائج المطلوبة:

SELECT c.company, l.quote, coalesce(l1.quote, 0),
       (l.quote - coalesce(l1.quote, 0)) AS result
  FROM (SELECT c.company, c.mts, max(l.ts) AS lts
      FROM (SELECT company, max(ts) AS mts FROM cq GROUP BY company) AS c
      LEFT JOIN cq l
        ON c.company = l.company AND c.mts > l.ts
     GROUP BY c.company, c.mts) AS c
  LEFT JOIN cq AS l ON l.company = c.company AND l.ts = c.mts
  LEFT JOIN cq AS l1 ON l1.company = c.company AND l1.ts = c.lts;

يمكنك مراقبة النتائج على SQL Fiddle .

يستخدم هذا الاستعلام فقط قدرات SQL القياسية ويجب أن يعمل على أي RDBMS.

| time                | company | quote |
+---------------------+---------+-------+
| 0000-00-00 00:00:00 | GOOGLE  |    40 |
| 2012-07-02 21:28:05 | GOOGLE  |    60 |
| 2012-07-02 21:28:51 | SAP     |    60 |
| 2012-07-02 21:29:05 | SAP     |    20 |

كيف أفعل تأخير على هذا الجدول في MySQL لطباعة الاختلاف بين علامات الاقتباس ، على سبيل المثال:

GOOGLE | 20
SAP    | 40  

من MySQL 8.0 وما فوق ليست هناك حاجة لمحاكاة LAG . مدعوم أصلاً ،

وظيفة النافذة :

تقوم بإرجاع قيمة expr من الصف الذي يتأخر (تسبق) الصف الحالي بواسطة الصفوف N داخل القسم الخاص به. إذا لم يكن هناك مثل هذا الصف ، فإن قيمة الإرجاع تكون افتراضية. على سبيل المثال ، إذا كانت N هي 3 ، تكون قيمة الإرجاع هي الافتراضية للصفين الأولين. إذا كانت N أو Default مفقودة ، فإن القيم الافتراضية هي 1 و NULL ، على التوالي.

SELECT
     company,
     quote,
     LAG(quote) OVER(PARTITION BY company ORDER BY time) AS prev_quote
FROM tab;

DBFiddle Demo





sliding-window