SQL:选择“直到”

时间:2008-11-13 16:00:59

标签: sql mysql select-until

我正在寻找一种方法来选择,直到达到一笔金额。

我的“文档”表格中包含“tag_id”和“size”字段。

我想用tag_id = 26选择所有文件,但我知道我只能处理600个单位的尺寸。因此,当我知道前10个文件已经添加到>时,选择100个文档并丢弃其中的90个文件是没有意义的。 600个单位。

所以,目标是:当我要丢弃大部分数据时,不要带回大量数据来解析。

...但我也非常想避免在此应用中使用游标。

我正在使用mysql。

3 个答案:

答案 0 :(得分:7)

在添加最大单位时,您需要某种方式来订购哪些记录优先于其他记录。否则,你怎么知道你保留的总记录数是多少?

SELECT d.id, d.size, d.date_created
FROM documents d
INNER JOIN documents d2 ON d2.tag_id=d.tag_id AND d2.date_created >= d.date_created
WHERE d.tag_id=26
GROUP BY d.id, d.size, d.date_created
HAVING sum(d2.size) <= 600
ORDER BY d.date_created DESC

这只是一个让您入门的基本查询,还有许多问题需要解决:

  • 停在&lt; = 600,因此在大多数情况下,您不会完全填写尺寸限制。这意味着您可能需要调整它以允许再记录一次。例如,如果第一条记录是> 600查询将不返回任何内容,这可能是个问题。
  • 以后检查是否有其他较小的记录可能仍然不适用于上限。
  • 具有相同date_created值的记录可以在这里和那里进行“双重计算”。

修改
更新后,他添加了他按日期排序的信息。

答案 1 :(得分:0)

效率低得多,但它确实避免了游标(假设你的文档表也有一个序列id列):

select a.id, (select sum(b.size) from documents b where b.id <= a.id and b.tag_id = 26)
from documents a
where a.tag_id = 26
order by a.id

另外,这是在pgsql中完成的,所以我不确定这个确切的语法是否适用于mysql。

然后你可以将它包装在另一个查找具有&gt;的查询中。 600(你必须命名sum列)并取第一个id。然后处理下面的所有ID,包括那个。

答案 2 :(得分:0)

您必须首先将文档存储在表变量中,按照要检索它们的顺序对它们进行排序,然后使用累积值更新每一行,以便您可以选择它。

 declare @documents_temp table (
    tag_id int,
    size int,
    cumulative_size int null)

insert into @documents_temp
select tag_id, size, size from documents order by tag_id

update @documents_temp d set d.cumulative_size = d.size + 
    (select top 1 cumulative_size from @documents_temp 
     where tag_id < d.tag_id order by tag_id desc)

select tag_id, size from @documents_temp where cumulative_size <= 600

不知道是否值得。