2012-05-10 1 views
0

Я ищу перманентный способ написания SQL-запроса.Выполняющий запрос с использованием аналитической функции для выбора записей с 2 ​​столбцами даты

У меня есть таблица с колонками (id, fname, lname, accountid, creation_date, update_date) и я должен искать записи в этой таблице, которые имеют тот же fname, lname, accountid и имеют самые последние дата основана на greatest(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 ' 'а', '2',' 07/01/201110: 59: 43' , нуль)

(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', 'г', '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, 'к', 'т', '2', '07/01/2009 10:59: 43 ',' 07/01/2012 10:59:43 ')

+0

Я не уверен, что я понимаю ваш вопрос. Было бы полезно разместить некоторые образцы данных, желаемый результат и объяснение того, как вы получили данные выборки до желаемого результата.Было бы даже лучше, если бы вы могли опубликовать это в форме «DDL», чтобы создать таблицу и «DML», чтобы вставить образцы данных, чтобы мы могли запускать ваш код в наших окружениях. –

+0

В первом наборе строк почему вы выбираете строку с «id» из 3, когда все 6 значений даты кажутся одинаковыми? –

ответ

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_date, update_date. Используя where rnk = 1, вы можете выбрать максимум creation_date, update_date.

+0

Я уже некоторое время борется с чем-то, и ваше предложение о ранге отлично работает! – Sun

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 вернулся, а не строк с id 1 или 2 поскольку все 3 строки имеют одинаковые update_date и creation_date. Я предполагаю, что вы хотите выбрать галстук, выбирая строку с наибольшим значением id. Если вы хотите реализовать другое правило, вам нужно сообщить нам, какое это правило.
  • Я также предполагаю, что update_date, если он существует, всегда будет больше или равен creation_date. Было бы странно, если бы строка была обновлена ​​до ее создания.
+0

благодарит за ответы –