如何在条件持续的情况下在Mysql中选择行

问题描述

| 我有这样的事情:
 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行。我知道可以使用处理程序来完成此操作,但是我无法使其正常工作。因此,任何使用处理程序或其他创意的解决方案都是不错的选择。 还应该在合理的时间复杂度下-解决方案,如何选择总计为总值60%的值 可以,但是它慢得像地狱:( 谢谢!!!!     

解决方法

        您可能需要使用
lead()
lag()
窗口函数,可能需要使用递归查询将行合并在一起。请参阅以下相关问题: 如果剧集直接连续或重叠,则合并DATE行 如果您使用的是MySQL,则可以使用以下方法来解决缺少窗口功能的问题: MySQL查询问题     ,        我不知道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,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