有条件的SQL GROUPING

时间:2018-09-02 19:30:40

标签: sql ms-access-2010

我相信这很容易实现,但是经过一整天的尝试,我不得不放弃并寻求您的帮助。

我有一张看起来像这样的桌子

| PatientID  | VisitId  | DateOfVisit  | FollowUp(Y/N) | FollowUpWks |
----------------------------------------------------------------------
| 123456789  | 2222222  |  20180802    |     Y         |     2       |
| 123456789  | 3333333  |  20180902    |     Y         |     4       |
| 234453656  | 4443232  |  20180506    |     N         |    NULL     |
| 455344243  | 2446364  |  20180618    |     Y         |    12       |
----------------------------------------------------------------------

基本上,我有一个PatientID列表,每个患者可以进行多次访问(VisitID和DateOfVisit)。 FollowUp(Y / N)指定是否需要再次与患者见面,以及在几周内再次见面(FollowUpWks)。

现在,我需要的是一个查询,该查询提取PatientID,DateOfVisit(最新的查询,并且仅在FollowUp为YES的情况下)和FollowUpWks字段。

最终结果应该像这样

| PatientID  | VisitId  | DateOfVisit  | FollowUp(Y/N) | FollowUpWks |
----------------------------------------------------------------------
| 123456789  | 3333333  |  20180902    |     Y         |     4       |
| 455344243  | 2446364  |  20180618    |     Y         |    12       |
----------------------------------------------------------------------

我能找到的最接近的是这段代码

SELECT PatientID,
       Max(DateOfVisit) AS LastVisit
FROM mytable
WHERE FollowUp = True
GROUP BY PatientID;

问题是,当我尝试将FollowUpWks字段添加到SELECT时,出现以下错误:“查询不将指定的表达式作为聚合函数的一部分。”但是,如果我将FollowUpWks添加到GROUP BY语句中,则会得到所有访问,而不仅仅是最近的访问。

1 个答案:

答案 0 :(得分:1)

您需要匹配最近一次的访问。一种方法使用相关的子查询:

SELECT t.*
FROM mytable as t
WHERE t.FollowUp = True AND
      t.DateOfVisit = (SELECT MAX(t2.DateOfVisit)
                       FROM mytable as t2
                       WHERE t2.PatientID = t.PatientID
                      );