سؤال

كيفية الاستعلام وعرض السجلات حتى تصل إلى رقم معين؟

لنفترض أنك تريد اختيار الطالب حتى يصل المبلغ الإجمالي لأموال الطالب إلى 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  

تشير خطة التنفيذ إلى أن فرز الجدول هو العملية الأكثر تكلفة.إذا كان هناك فهرس على الأعمدة للفرز حسب - يشير المثال إلى أنك تريد الفرز حسب معرف المفتاح الأساسي - سيصبح فحص الفهرس هو العملية الأكثر تكلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top