我有这样的事情:
Name.....Value
A...........10
B............9
C............8
含义,值按降序排列。我需要创建一个新表,其中包含构成总值的60%的值。所以,这可能是伪代码:
set Total = sum(value)
set counter = 0
foreach line from table OriginalTable do:
counter = counter + value
if counter > 0.6*Total then break
else insert line into FinalTable
end
如您所见,我正在解析sql行。我知道这可以使用处理程序完成,但我不能让它工作。因此,任何使用处理程序或其他创造性的解决方案都会很棒。
它也应该是一个合理的时间复杂度 - 解决方案how to select values that sum up to 60% of the total
工作,但它很慢如地狱:(
感谢!!!!
答案 0 :(得分:1)
您可能需要使用lead()
或lag()
window function,可能需要使用recursive query将行合并在一起。请参阅此相关问题:
merge DATE-rows if episodes are in direct succession or overlapping
如果你正在使用MySQL,你可以通过使用这样的东西来解决缺少窗口函数的问题:
答案 1 :(得分:0)
我不知道SQL Server(我假设您正在使用)支持哪些分析函数;对于Oracle,您可以使用类似:
select v.*,
cumulative/overall percent_current,
previous_cumulative/overall percent_previous from (
select
id,
name,
value,
cumulative,
lag(cumulative) over (order by id) as previous_cumulative,
overall
from (
select
id,
name,
value,
sum(value) over (order by id) as cumulative,
(select sum(value) from mytab) overall
from mytab
order by id)
) v
说明:
- sum(value)over ...计算总和的运行总和
- lag()为您提供前一行的值
- 然后你可以将它们组合起来找到第一行,其中percent_current> 0.6和percent_previous< 0.6