This method is deprecated or moved on the latest stable version.
The last existing version (v1.2.6) is shown here.
distinct(columns, order_by)
public
SELECT DISTINCT clause for a given set of columns and a given ORDER BY
clause.
Oracle requires the ORDER BY columns to be in the SELECT list for DISTINCT
queries. However, with those columns included in the SELECT DISTINCT list,
you won’t actually get a distinct
list of the column you want (presuming the column has duplicates with
multiple values for the ordered-by columns. So we use the FIRST_VALUE
function to get a single (first) value for each column, effectively making
every row the same.
# File activerecord/lib/active_record/connection_adapters/oracle_adapter.rb, line 464
def distinct(columns, order_by)
return "DISTINCT #{columns}" if order_by.blank?
# construct a valid DISTINCT clause, ie. one that includes the ORDER BY columns, using
# FIRST_VALUE such that the inclusion of these columns doesn't invalidate the DISTINCT
order_columns = order_by.split(',').map { |s| s.strip }.reject(&:blank?)
order_columns = order_columns.zip((0...order_columns.size).to_a).map do |c, i|
"FIRST_VALUE(#{c.split.first}) OVER (PARTITION BY #{columns} ORDER BY #{c}) AS alias_#{i}__"
end
sql = "DISTINCT #{columns}, "
sql << order_columns * ", "
end