SQL(Oracle) - 查询以查找所有重复项并仅保留最近创建的重复项

时间:2014-07-09 23:05:30

标签: sql oracle

所以我要求一个查询将采用任何搜索参数(如regexp_like中所示),并且查询结果会找到所有重复项,并且只保留具有最新创建日期的那些参数,并记住可能存在不同的重复项在结果集中。

下面的示例是一个包含2列'name'和'create_date'的表。

我到目前为止:

SELECT name, create_date

FROM (

    SELECT cs.name, cs.create_date,

    ROW_NUMBER() OVER (PARTITION BY cs.name ORDER BY cs.create_date DESC) AS     RowNo

    FROM names_and_dates_table cs

    WHERE REGEXP_LIKE(cs.name, 'Mr Gary', 'i')

 )

WHERE RowNo = 1;

为了澄清这一点,将在Web应用程序的类型提前场景中使用,以便用户在输入字段中键入时为其提供建议。在这种情况下,他们输入了“Mr Gary”,打算输入第二个名字。

理想情况下,我需要查询(对于此示例)来查看与regexp_like参数匹配的所有记录,这些记录可能是很多(或几个)以及有对,三元组或更多同名的任何地方只保留最新create_date的名称(显然也会保留没有重复的任何其他名称)。

我意识到max(create_date)会获得最新的日期,但我似乎无法在查询中正常工作。

任何帮助表示赞赏。 谢谢。

2 个答案:

答案 0 :(得分:0)

试试这个:

select cs.name, cs.create_date
  from names_and_dates_table cs
 where cs.create_date = ( select max(nt.create_date)
                            from names_and_dates_table nt
                           where nt.name = cs.name )
   and REGEXP_LIKE(cs.name, 'Mr Gary', 'i')
   and rownum = 1

答案 1 :(得分:0)

你非常接近。我认为您需要做的就是将 partition by留下来,如下所示:

SELECT name, create_date
FROM (
    SELECT cs.name, cs.create_date,
    ROW_NUMBER() OVER (ORDER BY cs.create_date DESC) AS RowNo
    FROM names_and_dates_table cs
    WHERE REGEXP_LIKE(cs.name, 'Mr Gary', 'i')
)
WHERE RowNo = 1;

您的正则表达式已经过滤到您的匹配项,因此只需获取最新的匹配项。