如何在没有子查询的情况下使用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不是一个选项,因为列中可能会有小的变化,这些变量对于此输出不重要。
答
在Postgres里distinct on()
通常更快然后使用一个窗口功能,也不需要一个子查询的同类解决方案:
select distinct on (uuid) *
from the_table
order by something
您有通过提供订单(这是你应该也用row_number()
来完成)以获得稳定的结果 - 否则所选行是“随机”的。
上述对于Postgres来说是正确的。你也用amazon-redshift
来标记你的问题 - 我不知道Redshift(它实际上是一个非常不同的DBMS)是否支持相同的事情,或者它是否有效。
+0
我同时使用redshift和postgres这么好知道。 – ForeverConfused
子查询有什么问题?这对我来说看起来很完美。 –
窗口函数在查询之后呈现,在您的示例中,首先运行'SELECT col1,col2 ... FROM ...',然后运行窗口函数row_number ** OVER **查询结果。这就是为什么你使用子查询来获取重复。这不是愚蠢的,而是它是什么,并且是解决这种查询的最佳方法之一。否则,你将不得不为此编写一个PL。 – Dan
哦,好的。我有很多专栏,重复他们两次看起来很笨拙。感谢您的反馈Juan,Dan – ForeverConfused