سؤال

ببساطة، لدي طاولة مع، من بين أمور أخرى، عمود للطوابع الزمنية. أريد أن أحصل على التوالي مع الطابع الزمني الأخير (أي قيمة أكبر). حاليا أنا أفعل هذا:

SELECT * FROM table ORDER BY timestamp DESC LIMIT 1

لكنني أفضل أن تفعل شيئا مثل هذا:

SELECT * FROM table WHERE timestamp=max(timestamp)

ومع ذلك، يرفض SQLite هذا الاستعلام:

SQL error: misuse of aggregate function max()

ال توثيق يؤكد هذا السلوك (أسفل الصفحة):

لا يجوز استخدام الوظائف الإجمالية إلا في عبارة مختارة.

سؤالي هو: هل من الممكن كتابة استعلام للحصول على الصف بأكبر طابع زمني دون طلب تحديد عدد الصفوف المرتجعة وحدها إلى 1؟ هذا يبدو أنه ينبغي أن يكون ممكنا، لكن أعتقد أن بلدي SQL-FU لا يصل إلى السعوط.

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

المحلول

SELECT * from foo where timestamp = (select max(timestamp) from foo)

أو، إذا أصر SQLite على علاج الفرعية كمجموعات،

SELECT * from foo where timestamp in (select max(timestamp) from foo)

نصائح أخرى

هناك العديد من الطرق لجلد القط.

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

SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

أعتقد أنني أجبت على هذا السؤال 5 مرات في الأسبوع الماضي الآن، لكنني متعب للغاية لإيجاد رابط إلى أحد تلك الموجودة الآن، حتى هنا مرة أخرى ...

SELECT
     *
FROM
     table T1
LEFT OUTER JOIN table T2 ON
     T2.timestamp > T1.timestamp
WHERE
     T2.timestamp IS NULL

أنت تبحث أساسا عن الصف حيث لا يوجد تطابق أي صف آخر في وقت لاحق منه.

ملاحظة: كما هو مذكور في التعليقات، لن تؤدي هذه الطريقة أيضا في هذا النوع من الموقف. عادة ما تعمل بشكل أفضل (ل SQL Server على الأقل) في المواقف التي تريد فيها الصف الأخير لكل عميل (كمثال).

يمكنك ببساطة القيام به

حدد *، كحد أقصى (Timestamp) من الجدول

يحرر:كدالة إجمالية لا يمكن استخدامها مثل هذا حتى يعطي خطأ. انا اخمن احزر ماذا squarecog. اقترح كان أفضل شيء للقيام به

SELECT * FROM table WHERE timestamp = (select max(timestamp) from table)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top