Как выбрать запись MAX на основе нескольких результатов из уникального идентификатора в MySQL - PullRequest
1 голос
/ 02 июня 2011

Я запускаю отчет в MySQL, который возвращает всех активных участников и связанные с ними выборы плана. Если член удален, это также отображается в отчете. Однако проблема, с которой я сталкиваюсь, заключается в том, что участник просто решает «изменить» планы. Наша действующая система «прекращает» первоначальный план и начинает с нового с сохранением первоначальной информации о регистрации для участника.

Примерные данные отчета могут выглядеть следующим образом:

MemberID | Last    | First | Plan Code |  Original Effective | Change Date   |   Term Date
--------------------------------------------------------------------------------------------
12345    | Smith   | John  |     A     |   05-01-2011        |               |   06-01-2011
12345    | Smith   | John  |     B     |   06-01-2011        |               |      

В приведенном выше примере участник имел код плана A с 1 мая 2011 года по 1 июня 2011 года. 1 июня 2011 года участник изменил свое покрытие на план B (и все еще активен, так как нет термина или данных об изменении ).

В конечном итоге мне нужно, чтобы в моем отчете вместо двух указанных выше строк было указано следующее:

MemberID | Last    | First | Plan Code |  Original Effective | Change Date   |   Term Date
--------------------------------------------------------------------------------------------
12345    | Smith   | John  |     B     |   05-01-2011        |  06-01-2011   | 

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

Я знаю, что могу попасть в одну строку, используя Group By ID члена, и я даже могу добавить дату изменения в соответствующее поле с помощью оператора (IF COUNT ()> 1), но я не могу выяснить, как показать правильный код плана (C) или как оставить дату термина незаполненной, сохранив первоначальную дату вступления в силу.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 02 июня 2011

Хотя я ненавижу столбцы со встроенными пробелами и их tick, это должно сделать это для вас. PreQuery определит количество записей политики, сохранит первую и последнюю записи, сгруппированные по элементам. После того, как ЭТО выполнено, он может повторно присоединиться к регистрации в плане для того же участника, но совпадать ТОЛЬКО с последней датой «Первоначального вступления в силу» для этого человека ... Это даст вам правильный код плана. Кроме того, если человек был уволен, его дата будет заполнена для вас. Если он все еще занят, в этой записи он будет пустым.

select STRAIGHT_JOIN
      pe2.MemberID,
      pe2.Last,
      pe2.First,
      pe2.`Plan Code`
      PreQuery.PlanStarted `Original Effective`,
      case when PreQuery.PlanEntries > 1 then PreQuery.LastChange end `Change Date`,
      pe2.`Term Date`
   from
      ( select 
              pe.MemberID,
              count(*) as PlanEntries,
              min( `pe`.`Original Effective` ) PlanStarted,
              max( `pe`.`Original Effective`) LastChange
           from
              PlanEnrollment pe
           group by
              pe.MemberID ) PreQuery

     join PlanEnrollment pe2
        on PreQuery.MemberID = pe2.MemberID
        AND PreQuery.LastChange = pe2.`Original Effective`
0 голосов
/ 02 июня 2011

Я помню, что имел проблему, но не придумал решение на основе GROUP BY;) Вместо этого, я думаю, вы можете сделать что-то вроде

SELECT memberid, plancode 
FROM members 
INNER JOIN plans ON members.id=plans.member_id 
WHERE plans.id IN 
  (SELECT id FROM plans 
   WHERE member_id = members.id 
   ORDER BY date DESC 
   LIMIT 0,1)
...