محاكاة تأخير وظيفة في MySQL
sliding-window (2)
| 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
لتحقيق النتيجة المرجوة ، يجب أولاً العثور على آخر الطوابع الزمنية الأخيرة واللاحقة لكل شركة. الأمر بسيط للغاية مع الاستعلام التالي:
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.
من 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;