如何选择最大100的总和

时间:2013-07-12 22:32:00

标签: sql sql-server

只要大小总和为100,我将创建一个sql语句来检索所有图像

我有这个:

SELECT PhotoNr
INTO # PhotoTabl
FROM Photo
WHERE Size <= 100????

ORDER BY PhotoOrder ASC

表-内容:

PhotoNr ...... Size
1 ............ 20
2 ............ 50
3 ............ 20
4 ............ 50
5 ............ 20

sql将给出结果:

PhotoNr ...... Size
1 ............ 20
2 ............ 50
3 ............ 20

对此有什么好的解决方案吗?

3 个答案:

答案 0 :(得分:3)

有很多方法可以给这只猫上皮。最好的将取决于您可以使用的是什么,以及尺寸等所施加的限制

一种选择是使用递归CTE(这个简单的例子假设连续的光子值,如果需要可以允许非连续):

;WITH CTE as (
  select PhotoNr, Size, Tot = Size
  from photos where photonr = 1
  union all
  select p.PhotoNr, p.Size, Tot = cte.Tot +p.Size
  from CTE
  join photos p on CTE.PhotoNr + 1 = p.photonr
  )
select photonr, size from cte
where tot < 100

SQL Fiddle Here

或者,一种非常简单的方式(代码)(但可能不那么高效)可以使用cross apply

select
  photonr,
  size
from photos p
  cross apply (
    select tot = sum(size) from photos sub
    where sub.photonr <= p.photonr) x
where tot <= 100

Another SQL Fiddle Here

答案 1 :(得分:3)

如果您使用的是SQL Server 2012+,则会有一个包含PhotoNr的键列{1}}的索引,并且预期返回的行数相对于该行中的行数较小。表

Size

答案 2 :(得分:0)

正如@MartinSmith在评论中所说,你只需计算一个运行总计。有很多方法,它取决于你的RDBMS,你可以利用什么来提高效率等。一个基本但非常低效的方式就是这样。

WITH cte AS
(
    SELECT p1.id, p1.size, SUM(p2.size) running_total
    FROM photos p1, photos p2
    WHERE p1.id >= p2.id
    GROUP BY p1.id, p1.size
)

SELECT id, size
FROM cte 
WHERE running_total <= 100

有一篇有趣的文章比较了创建一个总计here

的方法