как выбрать строки в Mysql, пока длится условие - PullRequest
4 голосов
/ 31 мая 2011

У меня есть что-то вроде этого:

 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% от общего числа работает, но он чертовски медленный :(
Спасибо !!!!

Ответы [ 2 ]

1 голос
/ 31 мая 2011

Скорее всего, вам потребуется использовать оконную функцию lead() или lag() , возможно, с рекурсивным запросом , чтобы объединить строки. Смотрите этот связанный вопрос:

объединить DATE-строки, если эпизоды находятся в прямой последовательности или перекрываются

И если вы используете MySQL, вы можете обойти отсутствие оконных функций, используя что-то вроде этого:

Mysql запрос проблема

0 голосов
/ 31 мая 2011

Я не знаю, какие аналитические функции поддерживает 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

Объяснение:
- сумма (значение) за ... вычисляет промежуточную сумму для суммы
- lag () дает вам значениедля предыдущей строки
- затем вы можете объединить их, чтобы найти первую строку, где процент_куррент> 0,6 и процент_предыдущее <0,6 </p>

...