如何在MySQL中基于一个唯一ID的多个结果选择MAX记录
我在mysql中运行一个报告,它返回所有活动成员及其关联的计划选择。如果一个成员被终止,这也会显示在报告中。然而,我面临的问题是,当一名成员决定“改变”计划时。我们的系统有效地“终止”了原始计划,并以新计划重新开始,同时为会员保留原始注册信息 示例报告数据可能如下所示:如何在MySQL中基于一个唯一ID的多个结果选择MAX记录,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,我在mysql中运行一个报告,它返回所有活动成员及其关联的计划选择。如果一个成员被终止,这也会显示在报告中。然而,我面临的问题是,当一名成员决定“改变”计划时。我们的系统有效地“终止”了原始计划,并以新计划重新开始,同时为会员保留原始注册信息 示例报告数据可能如下所示: MemberID | Last | First | Plan Code | Original Effective | Change Date | Term Date -----------------------
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(由于没有任何期限或变更数据,因此仍然有效)
最终,我需要我的报告生成以下内容,而不是上面的两行内容:
MemberID | Last | First | Plan Code | Original Effective | Change Date | Term Date
--------------------------------------------------------------------------------------------
12345 | Smith | John | B | 05-01-2011 | 06-01-2011 |
显示其原始计划生效日期、变更日期,并将终止字段留空
我知道我可以通过使用Group by Member ID进入一行,甚至可以使用(IF COUNT()>1)语句将更改日期添加到相应的字段中,但我无法确定如何显示正确的计划代码(C),或者如何将术语日期保留为空,保留原始生效日期
有什么想法吗?我记得有这个问题,但没有提出基于分组的解决方案;) 相反,我认为你可以这样做
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)
我记得有过这个问题,但没有提出基于分组的解决方案;) 相反,我认为你可以这样做
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)
虽然我不喜欢带有嵌入空格的列,而且必须勾选它们,但这应该可以帮到你。预查询将检测有多少个策略条目,并保留第一个和最后一个,按成员分组。完成后,它可以在同一成员上重新加入计划注册,但只匹配该人员的最后一个“原始生效”日期。。。这将为您提供正确的计划代码。此外,如果该人员被终止,将为您填写其日期。如果仍在使用,则该记录将为空白
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`
虽然我不喜欢带有嵌入空格的列,而且必须勾选它们,但这应该可以帮到你。预查询将检测有多少个策略条目,并保留第一个和最后一个,按成员分组。完成后,它可以在同一成员上重新加入计划注册,但只匹配该人员的最后一个“原始生效”日期。。。这将为您提供正确的计划代码。此外,如果该人员被终止,将为您填写其日期。如果仍在使用,则该记录将为空白
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`
@尼古拉斯78-从来没有想过解决方案的位置,很好的建议。然而,我看到的唯一问题是,我的结果查询实际上从顶部查询中获取了两个结果的一部分。它需要从结果2中提取计划,从1中提取原始生效日期,从2中动态提取更改日期和期限日期。快把我逼疯了@尼古拉斯78-从来没有想过解决方案的位置,很好的建议。然而,我看到的唯一问题是,我的结果查询实际上从顶部查询中获取了两个结果的一部分。它需要从结果2中提取计划,从1中提取原始生效日期,从2中动态提取更改日期和期限日期。快把我逼疯了!我已经添加了
best-n-per-group
标记。点击这个链接,你会看到许多关于这个问题的其他答案。我添加了best-n-per-group
标签。点击该链接,您将看到几十个相同问题的其他答案。嵌入空格的列是什么意思?@JM4,只是通过报告匹配您的列名,而不知道实际的列名。。。有些人确实有带空格的列,例如“LastName”而不是“LastName”。如果列在定义时有空格,则必须像我在本文/答案中所做的那样,在列周围使用勾选
字符。如果列名实际上不是“Original Effective”,那么显然必须根据表结构调整查询。这个查询应该可以解决您的问题。您所说的嵌入空格的列是什么意思?@JM4,只是为了通过报告匹配您的列名,而不知道实际的列名。。。有些人确实有带空格的列,例如“LastName”而不是“LastName”。如果列在定义时有空格,则必须像我在本文/答案中所做的那样,在列周围使用勾选
字符。如果列名实际上不是“Original Effective”,那么显然必须根据表结构调整查询。这个查询应该可以解决您的问题。