نمط تصميم MS-Access للقيمة الأخيرة للتجميع

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

  •  09-06-2019
  •  | 
  •  

سؤال

من الشائع أن يكون لديك جدول تكون فيه الحقول على سبيل المثال هي الحساب والقيمة والوقت.ما هو أفضل نمط تصميمي لإسترجاع القيمة الأخيرة لكل حساب؟لسوء الحظ، تمنحك الكلمة الأساسية الأخيرة في المجموعة آخر سجل فعلي في قاعدة البيانات، وليس السجل الأخير بأي فرز.وهو ما يعني IMHO لا ينبغي أبدا أن تستخدم.الطريقتان الخرقاء اللتان أستخدمهما هما إما أسلوب استعلام فرعي أو استعلام ثانوي لتحديد السجل الأخير، ثم الانضمام إلى الجدول للعثور على القيمة.أليس هناك نهج أكثر أناقة؟

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

المحلول

يبدو خيار الاستعلام الفرعي أفضل بالنسبة لي، وهو شيء مثل psuedo-sql التالي.قد يكون من الممكن/الضروري تحسينه عبر الانضمام، والذي سيعتمد على قدرات محرك SQL.

select * 
from table 
where account+time in (select account+max(time) 
                       from table 
                       group by account 
                       order by time) 

نصائح أخرى

هذه خدعة جيدة لإرجاع السجل الأخير في الجدول:

SELECT TOP 1 * FROM TableName ORDER BY Time DESC  

الدفع هذا الموقع لمزيد من المعلومات.

لا يمكنك أن تفعل:

select account,last(value),max(time)
from table
group by account

لقد اختبرت هذا (تم منحه لمجموعة أرقام قياسية صغيرة جدًا وتافهة تقريبًا) وقد أدى إلى نتائج مناسبة.

يحرر:

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

tom قد يكون من الأسهل بالنسبة لي بشكل عام إجراء استعلام "In" الذي اقترحته.عموما أفعل شيئا من هذا القبيل

select T1.account, T1.value
from table T as T1
where T1 = (select max(T2.time) from table T as T2 where T1.account = T2.Account) 

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

الإجابة الأكثر شيوعًا هي استعلام ثلاثي المستوى:يعثر المستوى الأول على الحد الأقصى، بينما يحصل المستوى الثاني على قيم الحقول بناءً على الاستعلام الأول.ثم يتم ضم النتيجة كجدول للاستعلام الرئيسي.سريعة ولكنها معقدة وتستغرق وقتًا طويلاً في البرمجة/الصيانة.

يعمل هذا الرابط، ولا يزال يعمل بسرعة كبيرة ويتطلب الكثير من العمل للترميز/الصيانة.شكرا لمؤلفي هذا الموقع.

http://access.mvps.org/access/queries/qry0020.htm

@shs
نعم، يجب أن يعمل هذا التحديد الأخير (القيمة)، لكنه لا يعمل ...ما أفهمه على الرغم من أنني لا أستطيع إنتاج مصدر موثوق هو أن القيمة الأخيرة تعطي آخر سجل فعلي في ملف الوصول، مما يعني أنه يمكن أن يكون الأول في الوقت المناسب ولكنه الأخير فعليًا.لذلك لا أعتقد أنه يجب عليك استخدام last(value) لأي شيء آخر غير صف عشوائي سيء حقًا.

أحاول العثور على أحدث تاريخ في مجموعة باستخدام منشئ الاستعلامات Access 2003، وواجهت نفس المشكلة أثناء محاولة استخدام LAST لحقل التاريخ.ولكن يبدو أن استخدام MAX يجد التاريخ المتأخر.

ربما تكون لغة SQL التالية خرقاء، ولكن يبدو أنها تعمل بشكل صحيح في Access.

SELECT
    a.account,
    a.time,
    a.value
FROM
    tablename AS a INNER JOIN [
        SELECT
            account,
            Max(time) AS MaxOftime
        FROM
            tablename
    GROUP BY
        account
    ]. AS b
    ON
        (a.time = b.MaxOftime)
        AND (a.account = b.account)
;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top