Существует ли более элегантный способ вычисления медианы группы чисел с использованием ruby-dbi и подключения к базе данных - PullRequest
1 голос
/ 05 августа 2011

У меня есть следующий код, который вычисляет медиану группы чисел, взятых из базы данных.Этот вопрос связан с тем, существует ли более простой способ вычисления медианы столбца из массива DBI :: ROWs?

В качестве массива в стороне, как сортировка в срединных вычислениях и ошибка «неопределенный метод»

require 'dbi'

def median(array, already_sorted=false)
        return nil if array.empty?
        # array.sort
        m_pos = array.size / 2
    return array.size % 2 == 1 ? array[m_pos] : mean(array[m_pos-1..m_pos])
end

def mean(array)
    array.inject(array.inject(0) { |sum, x| sum += x } / array.size.to_f)
end

begin
    dbh = DBI.connect('DBI:jdbc:Cache://10.150.98.11:1972/SQLHRT', 'tpathhrt', 'tpathhrt',
                 'driver'=>'com.intersys.jdbc.CacheDriver')

    sth = dbh.prepare("SELECT
        DATEDIFF('hh',Result_Set.Date_Time_Booked_In,current_timestamp) AS HrsIn
            FROM
        iLabTP.Outstanding_Work_Index,
        iLabTP.Result_Set Result_Set,
        iLabTP.Request
            WHERE
        Outstanding_Work_Index.Request_Row_ID = Result_Set.Request_Row_ID and
        Outstanding_Work_Index.Request_Row_ID = Request.Request_Row_ID and
        Result_Set.Set_Code = 'TVITDN' order by HrsIn ASC")

    sth.execute()

    arr =[1]
    sth.fetch do |row|
        arr << row[0]
    end

    printf "Number of Records %d:\n", arr.size
    printf "Median %s:\n", median(arr)

    sth.finish

rescue DBI::DatabaseError => e
     puts "An error occurred"
     puts "Error code:    #{e.err}"
     puts "Error message: #{e.errstr}"
ensure
     # disconnect from server
     dbh.disconnect if dbh
end

Ответы [ 2 ]

1 голос
/ 06 августа 2011

Intersystems Caché имеет функцию MEDIAN:

MEDIAN

Один из примеров на этой странице:

SELECT MEDIAN(birthd.decade.MEMBERS, MEASURES.[%COUNT]) ON 0 FROM patients
0 голосов
/ 12 августа 2011

Обновление

Ошибка в массиве была вызвана тем, что в наборе ActiveRecord отсутствовали элементы, исправленные

   <%if !statistic.HrsIn.nil? %>
   ['<%= statistic.Specimen_Number %>', <%= statistic.HrsIn %>],
   <% end %> 

Функция медианы только в кеше межсистемного глубокого просмотра и не в обычном SQL

...