对2列使用DISTINCT



我有这个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_idb.change_id合并为COALESCE(a.change_id, b.change_id)

外部SELECT将从结果中消除created_at,同时仍按其排序。从这个问题上看,你是否想要这个并不完全清楚。

细节依赖于未公开的信息:确切的表定义、基数、确切的需求。可能存在much为许多副本提供更快的解决方案。

:

  • 选择每个GROUP BY组的第一行?
  • PostgreSQL DISTINCT ON with different ORDER BY

最新更新