
SQLite3::createAggregate 메서드는 커스텀 애그리게이트 함수를 만들기 위해 사용됩니다. 이 메서드의 옵션은 다음과 같습니다.
- step: 이 함수는 애그리게이트 함수의 연산을 수행합니다. 인수로는 현재 결과값, 새로운 입력값, 그리고 이전 결과값이 전달됩니다. 예를 들어, 평균을 구하는 경우, 이전 결과값에 새로운 입력값을 더하고, 이전 결과값의 개수를 1 증가시키는 방식으로 연산을 수행할 수 있습니다.
- finalize: 이 함수는 애그리게이트 함수의 최종 결과를 계산합니다. 인수로는 현재 결과값이 전달됩니다. 예를 들어, 평균을 구하는 경우, 이전 결과값의 개수로 나누어 평균을 계산하는 방식으로 연산을 수행할 수 있습니다.
- aggregate: 이 함수는 애그리게이트 함수의 초기값을 설정합니다. 인수로는 애그리게이트 함수의 초기값이 전달됩니다. 예를 들어, 평균을 구하는 경우, 0을 초기값으로 설정하는 방식으로 연산을 수행할 수 있습니다.
- serialize: 이 함수는 애그리게이트 함수의 결과를 문자열로 변환합니다. 인수로는 애그리게이트 함수의 결과값이 전달됩니다. 예를 들어, 평균을 구하는 경우, 결과값을 문자열로 변환하는 방식으로 연산을 수행할 수 있습니다.
- deserialize: 이 함수는 문자열로 변환된 애그리게이트 함수의 결과를 원래 형태로 변환합니다. 인수로는 문자열로 변환된 애그리게이트 함수의 결과값이 전달됩니다. 예를 들어, 평균을 구하는 경우, 문자열로 변환된 결과값을 원래 형태로 변환하는 방식으로 연산을 수행할 수 있습니다.
예를 들어, 평균을 구하는 커스텀 애그리게이트 함수를 만들면 다음과 같습니다.
#hostingforum.kr
ruby
db = SQLite3::Database.new('example.db')
db.execute('CREATE TABLE example (value INTEGER)')
db.create_aggregate('mean', 1) do |result, value|
result['value'] += value
result['count'] += 1
end
db.create_aggregate('mean_finalize', 0) do |result|
result['value'] /= result['count']
end
db.execute('INSERT INTO example (value) VALUES (1)')
db.execute('INSERT INTO example (value) VALUES (2)')
db.execute('INSERT INTO example (value) VALUES (3)')
result = db.get_first_value('SELECT mean(value) FROM example')
puts result # => 2.0
result = db.get_first_value('SELECT mean_finalize(value) FROM example')
puts result # => 2.0
2025-06-01 22:10