Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

DISTINCT ON requires matching ORDER clause #24

Open
rangerscience opened this issue Jun 30, 2023 · 1 comment
Open

DISTINCT ON requires matching ORDER clause #24

rangerscience opened this issue Jun 30, 2023 · 1 comment

Comments

@rangerscience
Copy link

rangerscience commented Jun 30, 2023

Per Postgres docs - and experimentation! ;) - specify that the DISTINCT ON clause must have a matching ORDER BY, such that the columns used in the distinct clause are the left-most in the ORDER clause. So you end up needing to do:

Model.distinct_on(:col).order(:col)

It would be nice (I think?) if this was handled automagically. (Or is this supposed to be automagically handled by AREL?)

Bonus - This plays weird with other things that apply ordering (ActiveAdmin). My guess (and hope) is that there's a way to say "no, this ordering always is left-most", so that when something like AA adds their ordering, it doesn't break the DISTINCT ON.

@rangerscience rangerscience changed the title DISTINCT ON require ORDER DISTINCT ON requires matching ORDER clause Jun 30, 2023
@ezekg
Copy link
Collaborator

ezekg commented Oct 28, 2024

I think you could use a CTE to retain current order and then use distinct_on with the CTE rows:

cte      = Model.with(cte: Model.some_scope_not_ordered_by_col)
distinct = cte.from('cte as models').reorder(nil)
                                    .distinct_on(:col)

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants