Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中基于一个唯一ID的多个结果选择MAX记录_Mysql_Greatest N Per Group - Fatal编程技术网

如何在MySQL中基于一个唯一ID的多个结果选择MAX记录

如何在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 -----------------------

我在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(由于没有任何期限或变更数据,因此仍然有效)

最终,我需要我的报告生成以下内容,而不是上面的两行内容:

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”,那么显然必须根据表结构调整查询。这个查询应该可以解决您的问题。