当前位置: 首页 > 面试题库 >

选择直到SUM(users_count)达到1000的SQL查询

刘阳荣
2023-03-14
问题内容

我需要一个SQL查询来从消息队列中选择行,直到SUM(users_count)最多达到1000。 但是
,如果仅返回一行并且该行的users_count大于1000,就没有问题。

我需要类似的内容:(我添加了自己的关键字)

SELECT * FROM `messages_queue` UNTIL SUM(users_count) < 1000 AT LEAST 1 ROW

这是我的表结构:

messages_queue
-msg_id
-msg_body-users_count
(消息接收方的数量)
-时间(插入时间)


问题答案:

该解决方案将执行累积和,并在超过1000时停止:

SELECT NULL AS users_count, NULL AS total
  FROM dual
 WHERE (@total := 0)
 UNION
SELECT users_count, @total := @total + users_count AS total
  FROM messages_queue
 WHERE @total < 1000;

这意味着,如果您有两个值(例如800),则总和将为1600。第一个SELECT只是初始化@total变量。

如果要防止总和超过1000(除了单行的值大于1000的情况),那么我认为这是可行的,尽管您需要对其进行严格的测试:

SELECT NULL AS users_count, NULL AS total, NULL AS found
  FROM dual
 WHERE (@total := 0 OR @found := 0)
 UNION
SELECT users_count, @total AS total, @found := 1 AS found
  FROM messages_queue
 WHERE (@total := @total + users_count)
   AND @total < 1000
 UNION
SELECT users_count, users_count AS total, 0 AS found
  FROM messages_queue
 WHERE IF(@found = 0, @found := 1, 0);


 类似资料:
  • 我有一个用户批次表。我只想选择,直到我的总金额达到一定金额。 考虑以下查询: 查询结果为: 我想在表格上做一个选择,直到余额总数为6。然后只返回id 1,2: 余额总计为1的另一个示例。那么应该只返回ids 1: 余额合计为11的示例。应该只返回ids,3,4: 所以,在那之后,我需要用FORUPDATE ex锁定这些行: 我尝试了窗口功能,但它不允许锁定(更新)。感谢任何帮助。

  • 问题内容: 我陷入了涉及将水平行转换为垂直行的SQL查询(SQL Server) 以下是我的数据 转换后,该表应为 关于此的任何输入将有所帮助? 我正在尝试在分区上玩耍。但是它以某种方式不起作用!!! 谢谢 !!! 问题答案: 您可以使用: 或:

  • 我正在从Oracle迁移到sql server 2008。 我对系统中的双表进行了一些查询, 从DUAL中选择TO_CHAR(TRUNC(sysdate,'day')-0,'YYYYMMDD') 由于SQL server中没有双表,如何在SQL server上使用getdate with convert获得相同的结果? 我还听说过为双精度添加虚拟表,但这应该适用于我的查询吗?

  • 问题内容: 我有一张桌子,桌子之间有一对多的关系。每个记录可以有来自同一张表的n个孩子。例如 给定一个ID,我想递归选择所有文件夹记录的SUM(SIZE)。目标数据库是MySql 5,但是如果它的通用性足以在Oracle和MS- SQL中运行,那将是很好的选择。 我不知道树有多深,可能是1级,可能是50级(或更多) 问题答案: 这可能会有些帮助:http : //mikehillyer.com/a

  • 问题内容: 我工作的一个SQL查询的表有两列,并应返回的总和列的值,直到达到它也应该返回的值列在该河段的排序条件为 例如,我的数据如下 在上表中,金额总计应在按日期排序之后进行计算,并且一旦金额达到5000分,应返回金额及其关联的日期的总计。 排序数据后,它变成如下所示 查询应返回以下结果 上述结果是因为总和达到在 我可以知道一种更好的方法来处理它吗 问题答案: 对于SQL Server,您可以使

  • 问题内容: 我有一个数据库字段名称调用,我正在尝试使用如下所示的变量名称来选择它: 显然,SQL将解释为字符串,而不是数据库的字段,我如何以这种方式将其识别为字段名而不是字符串,可能没有任何select或if语句。 问题答案: 试试这个: 您必须组成一个动态查询,并使用 要在事物的“动态”方面添加更多内容,请使用存储过程。请参见此处的示例: http://www.marten-online.com