簡體   English   中英

如何 select 基於 MySQL 中唯一 ID 的多個結果的 MAX 記錄

[英]How to select a MAX record based on multiple results from a unique ID in MySQL

我在 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        |               |      

在上面的示例中,會員在 2011 年 5 月 1 日至 2011 年 6 月 1 日期間擁有計划代碼 A。2011 年 6 月 1 日,會員將其承保范圍更改為計划 B(並且由於沒有期限或更改數據而仍然有效)。

最終,我需要我的報告生成以下內容,而不是上面的 2 個行項目:

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

其中顯示了他的原始計划生效日期、更改日期,並將終止字段留空。

我知道我可以使用 Group By the Member ID 進入單行,我什至可以使用 (IF COUNT() > 1) 語句將更改日期添加到適當的字段中,但我無法弄清楚如何顯示正確的計划代碼 (C) 或如何將期限日期留空並保留原始生效日期。

有任何想法嗎?

雖然我討厭帶有嵌入空格的列並且不得不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`

我記得有這個問題,但沒有提出基於 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM