我有这个Postgres SQL查询,我想添加DISTINCT:
SELECT pairs, a.change_id, user_size, user_mile, b.change_short_name
FROM order_data a
FULL OUTER JOIN changes b
ON a.change_id = b.change_id
ORDER BY a.created_at ASC;
我试过了:
SELECT DISTINCT pairs, a.change_id, user_size, user_mile, b.change_short_name
FROM order_data a
FULL OUTER JOIN changes b
ON a.change_id = b.change_id
ORDER BY a.created_at ASC;
我得到错误:[42P10] ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list Position: 280
我需要对pairs
,a.change_id
和最大的a.created_at
使用DISTINCT。
实现这一点的正确方法是什么?
用GROUP BY
代替SELECT DISTINCT
。在ORDER BY
子句中使用MAX()
:
SELECT pairs, a.change_id, user_size, user_mile, b.change_short_name
FROM order_data a
FULL OUTER JOIN changes b
ON a.change_id = b.change_id
GROUP BY pairs, a.change_id, user_size, user_mile, b.change_short_name
ORDER BY MAX(a.created_at) ASC;
使用DISTINCT ON
。请注意ORDER BY
条款。这里有一些很好的例子/讨论。
SELECT DISTINCT ON (pairs, a.change_id)
pairs, a.change_id, user_size, user_mile, b.change_short_name
FROM order_data a
FULL OUTER JOIN changes b ON a.change_id = b.change_id
ORDER BY pairs, a.change_id, a.created_at DESC;
可能是:
SELECT pairs, change_id, user_size, user_mile, change_short_name
FROM (
SELECT DISINCT ON (pairs, change_id)
pairs, change_id, user_size, user_mile, b.change_short_name, a.created_at
FROM order_data a
FULL JOIN changes b USING (change_id)
ORDER BY pairs, change_id, a.created_at
ORDER BY created_at;
注意USING
子句,它将a.change_id
和b.change_id
合并为COALESCE(a.change_id, b.change_id)
。
外部SELECT
将从结果中消除created_at
,同时仍按其排序。从这个问题上看,你是否想要这个并不完全清楚。
细节依赖于未公开的信息:确切的表定义、基数、确切的需求。可能存在much为许多副本提供更快的解决方案。
:
- 选择每个GROUP BY组的第一行? PostgreSQL DISTINCT ON with different ORDER BY