Группа запросов DB2 по идентификатору, но с максимальной датой и максимальной последовательностью - PullRequest
3 голосов
/ 14 октября 2010

Мой стол похож на

ID    FName LName Date(mm/dd/yy) Sequence Value
101   A      B    1/10/2010      1       10 
101   A      B    1/10/2010      2       20
101   X      Y    1/2/2010       1       15
101   Z      X    1/3/2010       5       10
102   A      B    1/10/2010      2       10 
102   X      Y    1/2/2010       1       15
102   Z      X    1/3/2010       5       10

Мне нужен запрос, который должен вернуть 2 записи

101   A      B    1/10/2010      2       20
102   A      B    1/10/2010      2       10 

это максимум даты и максимум группы последовательности по идентификатору.

Может ли кто-нибудь помочь в этом.

Ответы [ 3 ]

1 голос
/ 14 октября 2010

Я рассмотрел ваше имя в качестве сотрудника .. проверьте, помогло ли вам следующее.

 select * from employee emp1
    join (select Id, max(Date) as dat, max(sequence) as seq from employee group by id)  emp2
    on emp1.id = emp2.id and emp1.sequence = emp2.seq and emp1.date = emp2.dat
1 голос
/ 19 октября 2010

Я фанат использования предложения WITH в инструкциях SELECT для организации различных шагов. Я считаю, что это облегчает чтение кода.

WITH max_date(max_date)
AS (
  SELECT MAX(Date)
  FROM my_table
),

max_seq(max_seq)
AS (
  SELECT MAX(Sequence)
  FROM my_table
  WHERE Date = (SELECT md.max_date FROM max_date md)
)

SELECT *
FROM my_table
WHERE Date = (SELECT md.max_date FROM max_date md)
AND Sequence = (SELECT ms.max_seq FROM max_seq ms);

Вы должны быть в состоянии оптимизировать это при необходимости.

1 голос
/ 14 октября 2010
-----------------------
-- get me my rows...
-----------------------
select * from myTable t
-----------------------
-- limiting them...
-----------------------
inner join 
----------------------------------
-- ...by joining to a subselection
----------------------------------
(select m.id, m.date, max(m.sequence) as max_seq from myTable m inner join
        ----------------------------------------------------
        -- first group on id and date to get max-date-per-id
        ----------------------------------------------------
        (select id, max(date) as date from myTable group by id) y
        on m.id = y.id and m.date = y.date
group by id) x

on t.id = x.id
and t.sequence = x.max_seq

Было бы простым решением, которое не учитывает ни связи, ни строк, где последовательность равна NULL.

РЕДАКТИРОВАНИЕ: Я добавил дополнительную группу, чтобы сначала выбрать max-date-per-id, а затем присоединиться к ней, чтобы получить max-sequence-per-max-date-per-id перед присоединение к основной таблице для получения всех столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...