如何获取单个整数/浮点列的总和达到某个值的行
Posted
技术标签:
【中文标题】如何获取单个整数/浮点列的总和达到某个值的行【英文标题】:How to fetch rows from which sum of a single integer/float column sums upto a certain value 【发布时间】:2020-04-16 13:29:23 【问题描述】:我有一张桌子。它具有以下结构
goods_receiving_items
身份证 item_id 数量 created_at我正在尝试获取符合以下条件的行
有一个 item_id
当数量列之和等于某个值时
所以例如我有以下数据
+----+---------+----------+------------+
| id | item_id | quantity | created_at |
+----+---------+----------+------------+
| 1 | 2 | 11 | 2019-10-10 |
| 2 | 3 | 110 | 2019-10-11 |
| 3 | 2 | 20 | 2019-11-09 |
| 4 | 2 | 5 | 2019-11-10 |
| 5 | 2 | 1 | 2019-11-11 |
+----+---------+----------+------------+
我尝试了以下查询:
SET @sum:= 0;
SELECT item_id, created_at, (@sum:= @sum + quantity) AS SUM, quantity
FROM goods_receiving_items
WHERE item_id = 2 AND @sum<= 6
ORDER BY created_at DESC
如果我不使用ORDER BY
,那么查询将给我 ID '1'。但是如果我使用ORDER BY
,它将返回所有带有item_id = 2
的行。
应按此顺序仅返回 ID '5' 和 '4'
我似乎无法解决这个问题,ORDER BY
对我的任务至关重要。
任何帮助将不胜感激
【问题讨论】:
【参考方案1】:您应该在结果集上使用 order by 你可以使用子查询来做到这一点
SET @sum:= 0;
select t.*
from t (
SELECT item_id
, created_at
, (@sum:= @sum + quantity) as sum
, quantity
FROM goods_receiving_items
WHERE item_id = 2 AND @sum<= 6
) t
ORDER BY created_at DESC
【讨论】:
这只是在达到总和后对结果进行排序。我需要的是从最新的行开始计算总和,即具有最大的“created_at”值【参考方案2】:您应该尝试使用INNER JOIN
和SELECT min(created_at)
或SELECT max(created_at)
来自 mysql 文档:
...从每个组中选择的值不会受到影响 添加 ORDER BY 子句。结果集的排序发生在 值已被选择,并且 ORDER BY 不会影响哪个值 服务器选择。
以下问题的答案可能会有所帮助:MYSQL GROUP BY and ORDER BY not working together as expected
【讨论】:
这不只是从表中获取一个值吗?【参考方案3】:四处搜索后,我提出了以下查询
SELECT
t.id, t.quantity, t.created_at, t.sum
FROM
( SELECT
*,
@bal := @bal + quantity AS sum,
IF(@bal >= $search_number, @doneHere := @doneHere + 1 , @doneHere) AS whereToStop
FROM goods_receiving_items
CROSS JOIN (SELECT @bal := 0.0 , @doneHere := 0) var
WHERE item_id = $item_id
ORDER BY created_at DESC) AS t
WHERE t.whereToStop <= 1
ORDER BY t.created_at ASC
在上述查询中,$search_number 是一个变量,用于保存必须达到的值。 $item_id 是我们正在搜索的项目。
这将返回 quantity 列的总和构成所需总和的所有行。总和将由 created_at 以降序排列的行进行,然后将按升序重新排列。
当库存管理系统中使用一定数量的物品时,我使用此查询来计算成本;所以这可能会帮助其他人做同样的事情。我在 *** 上从另一个 question 获取了大部分查询
【讨论】:
以上是关于如何获取单个整数/浮点列的总和达到某个值的行的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL - 如何在单个查询中获取列的最小值和最大值以及与它们关联的行?