تاريخ Sql حدد الصفوف ضمن نطاق X ثانية من بعضها البعض
سؤال
جدول SQL الخاص بي يشبه (رسالة، تم إنشاؤه)
أريد تحديد تلك الصفوف التي تقع ضمن X ثانية من بعضها البعض.لنفترض أن الرسالة الأخيرة موجودة خلال X ثانية من NOW()، فيجب تحديدها.إذا كانت الرسالة الثانية والأخيرة في غضون X ثانية من الرسالة الأخيرة، فيجب تحديدها أيضًا.وبعبارة أخرى، يجب مقارنة كل صف بالصف التالي والتحقق منه.بالنسبة للصف الأخير، يجب التحقق منه باستخدام say NOW().أريد في الأساس الجلسة الأخيرة من الرسائل (أيآخر مجموعة من الرسائل التي قمنا بربطها ببعضها البعض، بافتراض أن الرسائل المتتابعة خلال X ثانية مرتبطة ببعضها البعض)
ليس لدي أي فكرة عن كيفية كتابة استعلام SQL لهذا الغرض.هل هذا ممكن حتى؟
شكرا جزيلا على وقتك.
المحلول
يعمل هذا البرنامج النصي في SQLServer.يجب أن تكون قادرًا على إخراج عبارة التحديد وتشغيلها في MySQL.
DECLARE @Messages TABLE (Message VARCHAR(10), Created DATETIME)
DECLARE @Interval FLOAT
-- Interval is 1 day.
SET @Interval = 1
-- These should be in result
INSERT INTO @Messages VALUES ('Message1', GetDate())
INSERT INTO @Messages VALUES ('Message2', GetDate()-1)
-- These should not be in result
INSERT INTO @Messages VALUES ('Message3', GetDate()-3)
INSERT INTO @Messages VALUES ('Message4', GetDate()-5)
SELECT m1.Message, m1.Created
FROM @Messages m1
INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval
AND m2.Created >= m1.Created
AND m2.Message <> m1.Message
UNION ALL SELECT m2.Message, m2.Created
FROM @Messages m1
INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval
AND m2.Created >= m1.Created
AND m2.Message <> m1.Message
ORDER BY Created
نصائح أخرى
أعتقد أنك تفكر بشكل معقد للغاية (ولكن مرة أخرى، ربما أساءت فهم المطلب؟)
يؤدي هذا إلى تحديد جميع الرسائل التي تم إنشاؤها خلال 30 ثانية قبل رسالة معينة:
SELECT
Id,
MessageText,
MessageDate
FROM
Message
WHERE
TIME_TO_SEC(TIMEDIFF(
(
SELECT MessageDate
FROM Message
WHERE Id = 17
),
MessageDate
)) <= 30
حيث 17 هو بالطبع معرف الرسالة التي تهتم بها، و30 هو عدد الثواني في الإطار الزمني الخاص بك.