如何在没有子查询的情况下使用ROW_NUMBER为每个用户标识只选择一条记录?

问题描述:

我目前的重复删除方法真的很愚蠢。如何在没有子查询的情况下使用ROW_NUMBER为每个用户标识只选择一条记录?

select col1, col2 ... col500 from 
(select col1, col2 ... col500, ROW_NUMBER() OVER(PARTITION BY uid) as row_num) 
where row_num=1; 

有没有办法做到这一点没有子查询?选择distinct不是一个选项,因为列中可能会有小的变化,这些变量对于此输出不重要。

+1

子查询有什么问题?这对我来说看起来很完美。 –

+1

窗口函数在查询之后呈现,在您的示例中,首先运行'SELECT col1,col2 ... FROM ...',然后运行窗口函数row_number ** OVER **查询结果。这就是为什么你使用子查询来获取重复。这不是愚蠢的,而是它是什么,并且是解决这种查询的最佳方法之一。否则,你将不得不为此编写一个PL。 – Dan

+0

哦,好的。我有很多专栏,重复他们两次看起来很笨拙。感谢您的反馈Juan,Dan – ForeverConfused

在Postgres里distinct on()通常更快然后使用一个窗口功能,也不需要一个子查询的同类解决方案:

select distinct on (uuid) * 
from the_table 
order by something 

通过提供订单(这是你应该也用row_number()来完成)以获得稳定的结果 - 否则所选行是“随机”的。


上述对于Postgres来说是正确的。你也用amazon-redshift来标记你的问题 - 我不知道Redshift(它实际上是一个非常不同的DBMS)是否支持相同的事情,或者它是否有效。

+0

我同时使用redshift和postgres这么好知道。 – ForeverConfused