0

我正在寻找一种编写 SQL 查询的高性能方法。

我有一个包含列 ( id, fname, lname, accountid, creation_date, ) 的表,update_date我必须在该表中查找具有相同fname,并且最近日期基于的记录(注意可以为空)lnameaccountidgreatest(max(creation_date),max(update_date))update_date

我希望我需要使用分析函数

我有这些情况:

(id,fname,lname,accountid,creation_date,update_date)
(1,'a','a','2','07/01/2010 10:59:43','07/01/2010 10:59:43')
(2,'a','a','2','07/01/2010 10:59:43','07/01/2010 10:59:43')
(3,'a','a','2','07/01/2010 10:59:43','07/01/2010 10:59:43')

我想选择最后插入的:这条记录 (3,'a','a','2','07/01/2010 10:59:43','07/01/2010 10:59:43' )

(id,fname,lname,accountid,creation_date,update_date)
(3,'b','a','2','07/01/2009 10:59:43','07/01/2010 10:59:43')
(4,'b','a','2','07/01/2011 10:59:43',null)
(5,'b','a','2','07/01/2009 10:59:43','07/01/2009 10:59:43')

我想在两列 (creation_date,update_date) 上选择最新的一个,即 (4,'b','a','2','07/01/201110:59:43',null)

(id,fname,lname,accountid,creation_date,update_date)
(6,'c','g','4','07/01/2010 10:59:43',null)
(7,'c','g','4','07/01/2011 10:59:43',null)
(8,'c','g','4','07/01/2009 10:59:43',null)

我想在两列 (creation_date,update_date) 上选择最新的一个,即 (7,'c','g','4','07/01/2011 10:59:43',null)

(id,fname,lname,accountid,creation_date,update_date)
(9,'k','t','2','07/01/2009 10:59:43','07/01/2012 10:59:43')
(10,'k','t','2','07/01/2011 10:59:43',null)
(11,'k','t','2','07/01/2009 10:59:43','07/01/2009 10:59:43')

我想在两列 (creation_date,update_date) 上选择最新的一个,即 (9,'k','t','2','07/01/2009 10:59:43','07/01 /2012 10:59:43')

4

2 回答 2

2

您应该使用分析函数rank()row_number(). 我自己的特别偏好是,rank()但只有在按唯一索引分区时它才能真正有效。像下面这样,假设有一个唯一的索引fname, lname, accountid, creation_date

select *
  from ( select a.*
              , rank() over ( partition by fname, lname, accountid 
                      order by creation_date desc
                              , update_date desc ) as rnk
           from my_table a )
 where rnk = 1

这对,的每个组合进行fname, lname, accountid排序。使用, 使您可以选择最大值。creation_dateupdate_datewhere rnk = 1creation_date, update_date

于 2012-05-10T21:35:31.620 回答
0

听起来你想要类似的东西

SELECT *
  FROM (SELECT a.*,
               rank() over (partition by fname, lname, accountid
                                order by coalesce( update_date, creation_date ) desc,
                                         id desc) rnk
          FROM your_table)
 WHERE rnk = 1
  • 我猜想为什么您希望id返回 3 的行而不是id1 或 2 的行,因为所有 3 行都具有相同的update_dateand creation_date。我的猜测是,您想通过选择具有最大值的行来选择平局id。如果您想实施不同的规则,您需要告诉我们这是什么规则。
  • 我还假设update_date,如果存在,将始终大于或等于creation_date。如果在创建行之前更新了行,那就太奇怪了。
于 2012-05-11T20:54:07.003 回答