如何获得总和≥X的前N行?

时间:2015-04-17 08:13:45

标签: sql sql-server

我有桌子:

  • 产品(ID,重量,过期,......)

我想得到N个已过期的产品为假,重量总和为example >= 5kg

我该怎么做这个查询?

非常感谢。

编辑:我的问题似乎并不是很清楚。例如,我可以拥有这些产品:

  • p1:ID = 1,重量= 1;
  • p2:ID = 2,重量= 1;
  • p3:ID = 3,重量= 1;
  • p4:ID = 4,重量= 2;

例如,我想获得权重之和为3的前N个产品。顺序是相同的。

所以我想得到例如p1,p2和p3因为权重之和为3(在这种情况下N为3因为我需要3个产品),所以它是正确的。我可以得到p1和p4,这是正确的(在这种情况下,N是2,因为我只需要两个产品),或者p2和p4 ......等等。

4 个答案:

答案 0 :(得分:3)

你可以写成:

select top 10 * from -- top N goes here
 (
 SELECT *,SUM(weight) OVER (partition BY expired ORDER BY Id asc) as cumulativesum
 FROM 
 Products
 WHERE expired = 0
  )T 
  where cumulativesum>=5

DEMO

答案 1 :(得分:0)

SELECT TOP 10 p.*
FROM Prodcts p
WHERE p.expired = 0
AND   p.weight >= 5

但是,目前尚不清楚如何sum单个记录。

答案 2 :(得分:0)

要按列/表达式过滤数据,您需要使用WHERE子句。例如:

SELECT *
FROM DataSource
WHERE column = 0 -- or column = 'false'

要通过聚合表达式过滤数据,您需要使用HAVING子句。例如:

SELECT *
FROM DataSource
WHERE column = 0 -- or column = 'false'
HAVING SUM(something) > 100

为了获得某些内容的TOP记录,您应该使用适当的ORDER BY子句 - 您需要按照TOP N始终会给您相同结果的方式对数据进行排序。

答案 3 :(得分:0)

如果你需要总结你的问题所暗示的重量,请尝试

Select ID, [Weight]
From
(select ID, SUM([weight]) as [weight], Row_number() over(order by ID) as N
Where Expired = 0
Having SUM(weight) > = 5) X
where N <= @x

或者如果你想要最重的第一个

Select ID, [Weight]
From
(select ID, SUM([weight]) as [weight], Row_number() over(order by SUM([weight]) desc) as N
Where Expired = 0
Having SUM(weight) > = 5) X
where N <= @x

其中@X是所需数量