如何查询并显示记录,直到达到一定数量?
假设您要选择学生,直到学生的总金额达到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点。
答案 0 :(得分:4)
在搜索我自己的答案时遇到了这个问题。我以为我会在这里留下我的解决方案,因为这是完成相同任务的另一种方式,可能更有效率。诀窍是使用>=
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;
答案 1 :(得分:2)
SQL表没有“内在”顺序,因此您必须指定一些ORDER BY子句来赋予“until”短语任何含义。鉴于此,可以使用SELECT SUM(money)FROM学生ORDER BY xxx LIMIT N获得“第一”N个记录的总和。使用具有自然顺序整数的辅助表INTS,您可以找到最大值N类似于:
SELECT MAX(N) FROM INTS
WHERE (SELECT SUM(money) FROM student ORDER BY xxx LIMIT N) < 1000
最后将其作为整个SELECT中LIMIT子句的另一个嵌套SELECT插入。所有这些都闻起来像是效率相当低!通常,当嵌套的SELECT看起来太多而且太慢时,另一种方法是逐步执行此操作:首先使用“渐进总和”构建临时表,然后使用它来帮助您找到所需的限制。
答案 2 :(得分:1)
哎呀...... 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
执行计划表明对表进行排序是最昂贵的操作。如果要排序的列上有索引 - 您的示例表示您希望按主键ID排序 - 索引扫描将成为最昂贵的操作。