[英]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.