Выбор максимальных или минимальных результатов - PullRequest
0 голосов
/ 26 марта 2012

У меня есть вопрос, который доставляет мне неприятности.Я думаю, что, возможно, есть простое решение, но, пожалуйста, помогите мне, где вы можете!

Моя главная проблема заключается в том, что на cust_id часто приходится много писем.Существуют уникальные идентификаторы, такие как порядковый номер (seq_no) и дата обновления (updated_date).Я хочу, чтобы новый адрес электронной почты отображался только для одного клиента.

Кстати, это оракул БД.

Есть предложения?

SELECT DISTINCT
table1.indident_id, 
table1.incident_detail_id, 
table1.incdent_entered_date, 
table1.entering_employee, 
table2.EMAIL
FROM table1
left outer join table2 on table1.cust_id=table2.cust_id
WHERE table1.incdent_entered_date>=current_date-4
AND table1.table1.incident_detail_id=(select min(table1.table1.incident_detail_id)from table1)
AND table2.EMAIL NOT IN ('NONE','none','none@none.com')
AND table2.EMAIL like '%@%'

1 Ответ

0 голосов
/ 26 марта 2012

Пара вариантов.Наиболее эффективным является использование аналитической функции.

SELECT *
  FROM (
    SELECT table1.indident_id, 
           table1.incident_detail_id, 
           table1.incdent_entered_date, 
           table1.entering_employee, 
           table2.EMAIL,
           row_number() over (partition by table2.cust_id
                                  order by table2.updated_date desc) rnk
      FROM table1 
           left outer join table2 on table1.cust_id=table2.cust_id
     WHERE table1.incdent_entered_date>=current_date-4
       AND table1.table1.incident_detail_id=(select min(table1.table1.incident_detail_id)
                                               from table1)
       AND table2.EMAIL NOT IN ('NONE','none','none@none.com')
       AND table2.EMAIL like '%@%'
  )
 WHERE rnk = 1

Менее эффективно, но то, что будет работать практически в любой базе данных, - это сделать что-то похожее на то, что вы в настоящее время делаете с * 1004.* подзапрос

    SELECT table1.indident_id, 
           table1.incident_detail_id, 
           table1.incdent_entered_date, 
           table1.entering_employee, 
           table2.EMAIL
      FROM table1 
           left outer join table2 on table1.cust_id=table2.cust_id
     WHERE table1.incdent_entered_date>=current_date-4
       AND table1.table1.incident_detail_id=(select min(table1.table1.incident_detail_id)
                                               from table1)
       AND table2.update_date = (SELECT MAX(t2_inner.update_date)
                                   FROM table2 t2_inner
                                  WHERE t2_inner.cust_id = table1.cust_id)
       AND table2.EMAIL NOT IN ('NONE','none','none@none.com')
       AND table2.EMAIL like '%@%'
...