0

SQL クエリを作成する効率的な方法を探しています。

列 ( idfnamelnameaccountidcreation_date)を持つテーブルがあり、そのテーブル内で同じ、、およびに基づく最新の日付をupdate_date持つレコードを探す必要があります ( null の可能性があることに注意してください)。fnamelnameaccountidgreatest(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
  • 3つの行すべてが同じとであるため、1または2idの行ではなく、3の行を返す必要がある理由を少し推測しています。私の推測では、最大値の行を選択して同点を選択したいと思います。別のルールを実装する場合は、それがどのルールであるかをお知らせください。idupdate_datecreation_dateid
  • update_dateまた、が存在する場合は、常に。以上になると想定していcreation_dateます。行が作成される前に更新された場合は奇妙です。
于 2012-05-11T20:54:07.003 に答える