我有一个由健康计划成员组成的表格。
每条记录代表一项承保范围的选择或其承保范围的变化,包括生效日期。例如,每个成员都在1月进行初始计划选举。如果成员在3月生了孩子,并将其覆盖范围从单身家庭改为个人+家庭,则会创建一个具有新生效日期的记录。原始记录保留在表中,并创建具有新覆盖率选择的新记录。
我需要创建一个查询,以获取表中每个成员的最新覆盖范围,无论是一月份的原始选举还是三月份的最新覆盖范围更改。
我尝试了一些不同的SQL语句,但是没有一个能正确解决。
该表称为$> curl -i -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "abc+123/XYZ=" http://localhost:8080/testing\?x\=\&Z\=U
HTTP/1.1 400
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Thu, 27 Jun 2019 21:57:35 GMT
Connection: close
{"timestamp":"2019-06-27T21:57:35.516+0000","status":400,"error":"Bad Request","message":"Required request body is missing: public java.lang.String com.example.demo.stuff.MyController.myMapping(java.lang.String)","path":"/testing"}%
。下面的查询返回了3条记录,甚至不确定该如何计算。我想返回每个成员最近一次选举的全部记录。
任何帮助将不胜感激。谢谢!
tblPreviousExport
答案 0 :(得分:1)
有很多方法可以实现这一目标-
一种可能的方法是在子查询上使用inner join
,该子查询为每个Employee SSN
选择最大的生效日期:
select t1.*
from tblPreviousExport t1 inner join
(
select t2.[Employee SSN], max(t2.[Effective Date]) as md
from tblPreviousExport t2
group by t2.[Employee SSN]
) q
on t1.[Employee SSN] = q.[Employee SSN] and t1.[Effective Date] = q.md
另一种方法是使用相关的子查询,该子查询尝试选择日期晚于当前记录的记录,然后返回该子查询不返回任何结果的记录(由where not exists
子句表示):< / p>
select t1.*
from tblPreviousExport t1 where not exists
(
select 1 from tblPreviousExport t2
where
t1.[Employee SSN] = t2.[Employee SSN] and
t1.[Effective Date] < t2.[Effective Date]
)
LEFT JOIN
:最后,您还可以通过以下方式对left join
使用不相等的联接条件,返回在联接右侧没有满足联接条件的记录的记录:
select t1.*
from
tblPreviousExport t1 left join tblPreviousExport t2 on
t1.[Employee SSN] = t2.[Employee SSN] and
t1.[Effective Date] < t2.[Effective Date]
where
t2.[Effective Date] is null
此示例只能在SQL视图的MS Access中表示,因为MS Access查询设计器无法显示具有相等联接条件(即,一个字段等于另一个字段)的联接。
此示例的操作与相关子查询相似,但选择是通过联接执行的,而不是在WHERE
子句中进行的。