لحل هذه المشكلة في SQL، يمكنك استخدام الدوال اللازمة للحصول على الوقت الأقل والوقت الأكثر لكل تاريخ، ثم استخدام العبارات المشروطة CASE WHEN لتقديم البيانات بالشكل المطلوب. إليك كيفية تنفيذ ذلك باستخدام تقنية النافذة (Window Functions) في SQL Server:
sqlWITH 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
لعرض البيانات كما هو مطلوب.