لحل هذه المشكلة في SQL Server، يمكنك استخدام عبارة CASE في عبارة الاستعلام لتحقيق النتائج المطلوبة. في البداية، سنحتاج إلى استخدام عبارة الاستعلام الأساسية التالية لإنشاء جدول بالبيانات التي قدمتها:
sqlCREATE TABLE YourTableName (
id INT,
date INT,
value VARCHAR(10)
);
INSERT INTO YourTableName (id, date, value) VALUES
(1, 1, null),
(1, 2, 'a'),
(1, 3, 'b'),
(1, 4, null),
(2, 1, null),
(2, 2, null),
(2, 3, null),
(2, 4, null),
(2, 5, null);
الآن، يمكنك استخدام الاستعلام التالي للحصول على النتائج المطلوبة:
sqlSELECT
id,
CASE
WHEN MAX(CASE WHEN value IS NULL THEN date ELSE 0 END) > MAX(CASE WHEN value IS NOT NULL THEN date ELSE 0 END)
THEN MAX(CASE WHEN value IS NULL THEN date ELSE 0 END)
ELSE MAX(CASE WHEN value IS NOT NULL THEN date ELSE 0 END)
END AS date,
MAX(value) AS value
FROM YourTableName
GROUP BY id;
هذا الاستعلام يستخدم عبارة CASE للتحقق من قيمة العمود value
، وإذا كانت القيمة NULL
في جميع الصفوف لل id
معين، يتم استخدام أقصى قيمة لل date
في تلك ال id
. وإذا كان هناك قيم غير NULL
، يتم استخدام أقصى قيمة لل date
مع تلك القيم.
يرجى تغيير YourTableName
بالجدول الفعلي الخاص بك.
المزيد من المعلومات
لفهم الاستعلام الذي تم توضيحه أعلاه بشكل أفضل، يمكن تقسيمه إلى عدة أقسام:
-
CASE WHEN value IS NULL THEN date ELSE 0 END
: هذا الجزء يستخدم عبارة CASE لإعادة قيمة العمودdate
إذا كانت قيمة العمودvalue
NULL
، وإلا يعيد القيمة صفر. -
MAX(CASE WHEN value IS NULL THEN date ELSE 0 END)
: هذا الجزء يستخدم الدالة MAX للحصول على أقصى قيمة للdate
عندما تكون قيمة الvalue
NULL
. -
MAX(CASE WHEN value IS NOT NULL THEN date ELSE 0 END)
: هذا الجزء يستخدم الدالة MAX للحصول على أقصى قيمة للdate
عندما تكون قيمة الvalue
غيرNULL
. -
CASE WHEN ... THEN ... ELSE ... END AS date
: هذا الجزء يستخدم عبارة CASE مرة أخرى لاختيار أكبر قيمة بين أقصى قيمة للdate
عندما تكون قيمةvalue
NULL
وأقصى قيمة للdate
عندما تكون قيمةvalue
غيرNULL
. -
MAX(value) AS value
: هذا الجزء يستخدم الدالة MAX للحصول على قيمةvalue
الكبيرة بين الصفوف التي تحتوي على نفس الid
.
باختصار، يستخدم الاستعلام ال CASE statements لفحص القيم في العمود value
ويختار أكبر قيمة لل date
بناءً على ذلك، مع الحفاظ على القيمة value
للصف الذي يحتوي على أقصى قيمة لل date
المختارة.