البرمجة

SQL: Min and Max Time Records per Date

لحل هذه المشكلة في SQL، يمكنك استخدام الدوال اللازمة للحصول على الوقت الأقل والوقت الأكثر لكل تاريخ، ثم استخدام العبارات المشروطة CASE WHEN لتقديم البيانات بالشكل المطلوب. إليك كيفية تنفيذ ذلك باستخدام تقنية النافذة (Window Functions) في SQL Server:

sql
WITH CTE AS ( SELECT name, Dates, Door, ROW_NUMBER() OVER (PARTITION BY name, CAST(Dates AS DATE), Door ORDER BY Dates) AS rn_asc, ROW_NUMBER() OVER (PARTITION BY name, CAST(Dates AS DATE), Door ORDER BY Dates DESC) AS rn_desc FROM YourTableName ) SELECT name, MAX(CASE WHEN Door = 'Entrance' THEN Dates END) AS Entrance, MAX(CASE WHEN Door = 'Exit' THEN Dates END) AS Exit FROM CTE WHERE rn_asc = 1 OR rn_desc = 1 GROUP BY name, CAST(Dates AS DATE) ORDER BY name, CAST(Dates AS DATE)

يرجى استبدال YourTableName بالاسم الصحيح لجدولك. هذا الاستعلام يستخدم CTE (Common Table Expression) لتوليد رقم صف لكل صف وفقًا لتاريخ الإدخال (باستثناء الوقت) والباب. ثم، يقوم بتحديد الصفوف التي تحتوي على الوقت الأقل والأكثر لكل تاريخ باستخدام العبارات rn_asc و rn_desc. أخيرًا، يقوم الاستعلام بفلترة الصفوف واستخدام CASE WHEN لعرض الوقت الأقل (Entrance) والأكثر (Exit) لكل تاريخ.

المزيد من المعلومات

بالطبع! في هذا السياق، يُستخدم معامل PARTITION BY لتجزئة البيانات بحيث يتم تطبيق الدوال النافذة على كل مجموعة من الصفوف التي تشترك في نفس القيم للحقول المحددة في PARTITION BY. على سبيل المثال، في الاستعلام السابق، تم تقسيم البيانات حسب الحقول name و CAST(Dates AS DATE) و Door، مما يعني أن الدوال النافذة ستُطبق على مجموعة من الصفوف التي تحتوي على نفس الاسم ونفس التاريخ (باستثناء الوقت) ونفس الباب.

بعد ذلك، يتم استخدام ROW_NUMBER() لترقيم الصفوف بترتيب التواريخ (Dates)، وذلك باستخدام ORDER BY Dates للحصول على الترتيب الصحيح. يتم استخدام rn_asc للحصول على ترتيب تصاعدي (أي الصف الأول لكل تاريخ وباب)، بينما يتم استخدام rn_desc للحصول على ترتيب تنازلي (أي الصف الأخير لكل تاريخ وباب).

في النهاية، يتم استخدام CASE WHEN في العبارات MAX لاختيار الوقت الأقل (Entrance) والوقت الأكثر (Exit)، حيث يتم فرز الصفوف حسب اسم المستخدم (name) وتاريخ الإدخال (CAST(Dates AS DATE))، ثم تجميعها باستخدام GROUP BY لعرض البيانات كما هو مطلوب.

زر الذهاب إلى الأعلى