All rules
Safety
postgresql/
Require ORDER BY alongside `SELECT DISTINCT ON (...)` so the surviving row is deterministic.
Why this matters
Without `ORDER BY`, PostgreSQL keeps an arbitrary row from each group of `DISTINCT ON` — the result depends on scan order and changes silently across plan or stats updates. Pair `DISTINCT ON` with an `ORDER BY` whose leading columns match.
Examples
Incorrect
SELECT DISTINCT ON (customer_id) customer_id, amount FROM orders;Correct
SELECT DISTINCT ON (customer_id) customer_id, amount
FROM orders
ORDER BY customer_id, created_at DESC;SELECT DISTINCT customer_id FROM orders;Configure it
// eslint.config.js
import postgresql from "eslint-plugin-postgresql";
export default [
{
files: ["**/*.sql"],
languageOptions: {
parser: postgresql.configs.recommended.languageOptions.parser,
},
plugins: { postgresql },
rules: {
"postgresql/no-distinct-on-without-order-by": "error",
},
},
]; Options
Edit the SQL — only no-distinct-on-without-order-by is enabled.
Pre-filled with the first incorrect example. Toggle off in the rule shelf to see how the diagnostic disappears.
Diagnostics
No issues found.
2 rules enabled.
Rule under test
no-distinct-on-without-order-by — plus no-syntax-error as a safety net.