如何在条件持续时选择Mysql中的行

时间:2011-05-31 11:26:15

标签: sql sorting handler

我有这样的事情:

 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 工作,但它很慢如地狱:(
感谢!!!!

2 个答案:

答案 0 :(得分:1)

您可能需要使用lead()lag() window function,可能需要使用recursive query将行合并在一起。请参阅此相关问题:

merge DATE-rows if episodes are in direct succession or overlapping

如果你正在使用MySQL,你可以通过使用这样的东西来解决缺少窗口函数的问题:

Mysql query problem

答案 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