не может вычислить среднее значение, исключающее текущее наблюдение, используя .each block и sqlite3 - PullRequest
1 голос
/ 09 апреля 2019

Я приложил все усилия, чтобы сократить код до минимума и предоставил краткое объяснение проблемы (я надеюсь)

У меня есть схема БД, как указано ниже.

def a_method(info_hash)
     ...
     db.execute2 "create table if not exists Table1(Id INTEGER PRIMARY KEY, Item TEXT, Amount FLOAT, Type TEXT, AvgInc FLOAT, AvgX FLOAT, Total FLOAT)"
     ...
end

Это создает мою схему.Заполнив базу данных, я запускаю следующий метод, который дает мне значение #{@total}, сгруппированное по моему столбцу Type:

def get_total(info_hash)
    ...
    get_amt =  db.execute2 "SELECT sum(Amount) from Table1 WHERE Type = :Type", info_hash[:category]
    puts "foo"
    db.execute2 "UPDATE Table1 SET Total = :Total WHERE Type = :Type", get_amt[1][0], info_hash[:category]
    @total=get_amt[1][0]
    ...
    @total
end

Я хочу запустить следующий метод для вычисления среднего Itemв случае, если элемент не существует.В основном влияние каждого Item в среднем составляет Type.

Пожалуйста, см. В кодовом комментарии, где я думаю, что моя логика неверна

def method_excluding(info_hash) 
     ...
     get_num =  db.execute2 "SELECT Amount from Table1 WHERE Type = :Type", info_hash[:category]
    i = 0
    get_num.each do |item| 
    #purpose of block to compute an average value for Type as if #{item} did not exist.  So: the average value for Type EXLCUDING #{item}
        if i == 1
            @avgx = (@total - get_num[1][0]) / i
        elsif i > 1
            @avgx = (@total - get_num[i][0]) / (i - 1)
        end         
        i+=1
        db.execute2 "UPDATE Table1 SET AvgX = :AvgX WHERE Type = :Type", @avgx, info_hash[:category]
        ...
end

Пожалуйста, сообщите, как мне достичь желаемого результата.

...