تاريخ Sql حدد الصفوف ضمن نطاق X ثانية من بعضها البعض

StackOverflow https://stackoverflow.com/questions/839036

  •  22-07-2019
  •  | 
  •  

سؤال

جدول 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 هو عدد الثواني في الإطار الزمني الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top