سؤال

أحتاج إلى بعض المساعدة في استعلام - أنا أستخدم Firebird 2.1.

لدي طاولة مثل:

RowID (primary key) | ActivityID | Duration | BilledAt

1 | 1 | 50 | 06.08.2010, 14:05:00.598
2 | 1 | 70 | 06.08.2010, 14:05:00.608
3 | 2 | 30 | 06.08.2010, 14:05:00.598
4 | 3 | 40 | 06.08.2010, 14:05:00.598
5 | 3 | 50 | 06.08.2010, 14:05:00.608

أرغب في الحصول على فترات كل نشاط ، ولكن إذا كان هناك أكثر من إدخالات متوفرة مع نفس ActivityId ، فأنا بحاجة إلى الحصول على أعلى قيمة بيلدات. (أحدث إدخال)

إذا قمت بتنفيذ:

SELECT ActivityID, Max(BilledAt) 
FROM BilledTime 
GROUP BY ActivityID;

سأحصل على ما أريد بدون قيم المدة. إذا قمت بتضمين عمود المدة في المجموعة حسب الجملة ، فسيتم تحديد نشاطات متعددة.

هل هناك حل أنيق لهذا؟

شكرًا!

هل كانت مفيدة؟

المحلول

لست على دراية بـ Firebird ، لذا قد يكون بناء الجملة خطأ ، ولكن هذا يجب أن ينجح:

SELECT a.ActivityID, a.Duration, a.BilledAt
FROM BilledTime a
LEFT JOIN BilledTime b on a.ActivityID = b.ActivityID AND b.BilledAt > a.BilledAt
WHERE b.ActivityID IS NULL

بدلاً من ذلك ، يمكنك استخدام مسمة فرعية أكثر بديهية حيث لا توجد مسمة فرعية بدلاً من الانضمام الأيسر ، لكنني أعتقد أن ما سبق ينتهي به المطاف بشكل أسرع.

نصائح أخرى

سأفعل مثل هذا

SELECT a.ActivityID, a.Duration, a.BilledAt 
FROM BilledTime a 
WHERE a.BilledAt = (select max(b.billedAt) from BilledTime b where b.ActivityId = a.ActivityID)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top