Сумма до определенного момента - MySql - PullRequest
6 голосов
/ 08 мая 2009

Как сделать запрос и отображать записи, пока не достигнет определенного числа?

Предположим, вы хотите выбрать студента, пока общая сумма денег студента не достигнет 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.

Ответы [ 3 ]

4 голосов
/ 27 июля 2011

наткнулся на этот вопрос при поиске собственного ответа. Я думал, что оставлю свое решение здесь, так как это еще один способ выполнить ту же задачу и может быть более эффективным. Хитрость заключается в самостоятельном соединении с использованием >=

    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;
2 голосов
/ 08 мая 2009

Нет никакого «внутреннего» порядка в таблице SQL, поэтому вам придется указать какое-либо предложение ORDER BY, чтобы придать этой фразе «до» какое-либо значение. Учитывая, что сумма `` первых '' N записей может быть получена с помощью SELECT SUM (деньги) ОТ студента ORDER BY xxx LIMIT N. Используя вспомогательную таблицу INTS, которая имеет целые числа в естественном порядке, вы можете найти максимально подходящий N чем-то вроде:

SELECT MAX(N) FROM INTS
WHERE (SELECT SUM(money) FROM student ORDER BY xxx LIMIT N) < 1000

и, наконец, вставьте это как еще один вложенный SELECT для предложения LIMIT в вашем общем SELECT. Все это пахнет, как будто это было бы довольно неэффективно, хотя! Как часто, когда вложенные SELECT кажутся слишком большими и слишком медленными, альтернатива делает это поэтапно: сначала создайте временную таблицу с «прогрессивными суммами», а затем используйте ее, чтобы найти нужный предел.

1 голос
/ 08 мая 2009

Упс ... MySQL ... это решение для 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  

План выполнения указывает, что сортировка таблицы является самой дорогой операцией. Если в столбцах для сортировки имеется индекс - пример показывает, что вы хотите отсортировать по идентификатору первичного ключа - сканирование индекса станет самой дорогой операцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...