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

У меня есть следующий метод. Мой код цепляется за if statement в моем блоке .each с ошибкой: nil can't be coerced into Float (TypeError).

Я пробовал много вариантов, все загвоздки в блоке .each.

Код должен вычислять среднее значение всех элементов, сгруппированных по Type, , исключая текущее наблюдение . Например, 10 пунктов с 10 различными значениями под Type foo. Элемент 1 имеет ячейку, вычисляющую среднее из 9 элементов - , исключая сам . Пожалуйста, порекомендуйте. Я в конце остроумия.

Код ниже - это метод, существующий в моей IDE. Ruby 2.3.7

specific_row[0] должно относиться к Id и specific_row[1] должно относиться к Amount. Примечание: Я решил использовать .execute сверх .execute2 в попытке не отключить данные заголовка.

def billavgx(info_hash)
    begin
        db = SQLite3::Database.open('billinfo.db')
        db.results_as_hash = true
        db.transaction
        specific_amt =  db.prepare "SELECT Amount AND Id FROM bills WHERE Type = :Type" 
        specific_amt.execute info_hash[:category]
        specific_amt.each do |specific_row|
            if @total_rows == 1
                @avgx = (@total_amt - specific_row[1]) / @total_rows
            elsif @total_rows > 1
                @avgx = (@total_amt - specific_row[1]) / (@total_rows - 1)
            else
                return "insufficient entries"
            end         
            db.execute2 "UPDATE bills SET AvgX = :AvgX WHERE Id = :Id AND Type = :Type", @avgx, specific_row[0], info_hash[:category]
            end
        puts db.changes.to_s + " changes made"
        db.commit
    rescue SQLite3::Exception => e
        puts "error here " , e
    ensure
        specific_amt.close if specific_amt
        db.close if db
    end
end

1 Ответ

0 голосов
/ 12 апреля 2019

Одной из основных проблем с вышеуказанным блоком .each является использование instance variable.Замена @avgx на local variable avgx решает эту проблему.avgx может затем использоваться в операторе SQL UPDATE.

Секунда specific_row array должна указывать правильное значение.В этом случае желаемое значение составляет Amount.Поскольку arrays имеют индекс 0, значение для Amount хранится в `specific_row [0] '.

        specific_amt.each do |specific_row|
            if @total_rows == 1
                avgx = @total_amt / @total_rows
            elsif @total_rows > 1
                avgx = (@total_amt - specific_row[0]) / (@total_rows - 1)
            else
                puts "insufficient entries"
                return "insufficient entries"
            end 
        db.execute2 "UPDATE bills SET AvgX = :AvgX WHERE Amount = :Amount AND Type = :Type AND Year = :Year", avgx, specific_row[0], info_hash[:category], info_hash[:year]
        end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...