سؤال
كيفية الاستعلام وعرض السجلات حتى تصل إلى رقم معين؟
لنفترض أنك تريد اختيار الطالب حتى يصل المبلغ الإجمالي لأموال الطالب إلى 1000؟
إضافة
Student ID Student Name Student Money
--------- ----------- --------------
1 John 190
2 Jenny 290
3 Ben 200
4 Andy 120
5 Lynna 300
إذا أردت التوقف عند 500، سأحصل على السجل رقم 1 و2 (190 + 290).إذا أردت التوقف عند 1000، سأحصل على الرقم القياسي من 1 إلى 4.
المحلول
وليس هناك "جوهري" النظام إلى جدول SQL، لذلك سيكون لديك لتحديد بعض ORDER BY إلى إعطاء أن "حتى" العبارة أي معنى. وبالنظر إلى أن مجموع `` '' سجلات N الأولى يمكن الحصول عليها مع SUM SELECT (المال) FROM ORDER BY طالب الثلاثون LIMIT N. باستخدام [إينتس] طاولة المساعدة التي لديها أعداد صحيحة في النظام الطبيعي، يمكنك أن تجد الحد الأقصى مناسبة N شيء مثل:
SELECT MAX(N) FROM INTS
WHERE (SELECT SUM(money) FROM student ORDER BY xxx LIMIT N) < 1000
ووإدراج أخيرا هذا وذاك SELECT متداخلة لشرط LIMIT في حياتك عموما SELECT. كل هذا تنبعث منه رائحة سيكون غير فعال إلى حد ما، على الرغم من! في كثير من الأحيان عندما تبدأ باختيار متداخلة كثيرة جدا وبطيئة جدا، بديلا يقوم به هذا في الخطوات التالية: أولا إنشاء جدول مؤقت مع "مبالغ التقدمية"، ثم استخدام ذلك لمساعدتك في العثور على حد ما تحتاجه
نصائح أخرى
وجاء في هذا السؤال في الوقت الذي تبحث عن إجابة بلدي. ظننت أنني كنت أترك الحل هنا حيث أنها طريقة أخرى لإنجاز نفس المهمة، وربما يكون أكثر كفاءة. الحيلة هي الذات الانضمام باستخدام >=
SELECT s1.ID, s1.name, s1.money, sum(s2.money)
FROM student s1
INNER JOIN student s2 ON s1.id >= s2.id
GROUP BY s1.id HAVING SUM(s2.money) <= 500;
أُووبس ...ماي إس كيو إل ...هذا الحل مخصص لـ MS SQL ...
إليك الحل باستخدام الدالة ROW_NUMBER().
SELECT Student.*, SUM(StudentBefore.Money) AS AccumulatedMoney
FROM (
SELECT *, ROW_NUMBER() OVER(ORDER BY Id) AS RowNumber
FROM Students
) AS Student
INNER JOIN
(
SELECT *, ROW_NUMBER() OVER(ORDER BY Id) AS RowNumber
FROM Students
) AS StudentBefore
ON StudentBefore.RowNumber <= Student.RowNumber
GROUP BY Student.RowNumber, Student.Id, Student.Name, Student.Money
HAVING SUM(StudentBefore.Money) < 1000
تشير خطة التنفيذ إلى أن فرز الجدول هو العملية الأكثر تكلفة.إذا كان هناك فهرس على الأعمدة للفرز حسب - يشير المثال إلى أنك تريد الفرز حسب معرف المفتاح الأساسي - سيصبح فحص الفهرس هو العملية الأكثر تكلفة.