我想从2014年1月1日或之后但不晚于2014年12月31日的表中检索所有具有第一项的行

表格示例:

OID    FK_OID    Treatment    Trt_DATE
 1      100       19304       2011-05-24
 2      100       19304       2011-08-01
 3      100       19306       2014-03-05
 4      200       19305       2012-02-02
 5      300       19308       2014-01-20
 6      400       19308       2014-06-06


例如。我想撤回所有在2014年开始治疗的条目。因此,在上面我要提取FK_OID的300和400,因为它们的第一个条目是在2014年,但是我想省略FK_OID 100,因为它们在2014年之前有2个条目。

我该怎么办?我可以提取日期范围内的所有条目,等等,但是会带回该日期的所有条目,并且不会忽略在日期范围开始之前有条目的任何人。它只是在2014年返回了他们的第一个条目。

对于那些需要看到我尝试过的东西的人。见下文。
我不是一个经验丰富的编码员,这是我能得到的最好的,因为我没有知识。

SELECT
    mod,
    (select NHSNum from person p
    WHERE
        p.oid = t.fk_oid) as 'NHS'
    FROM
        timeline t
    Where trt_date BETWEEN '2014-01-01' AND '2014-12-31'
    ORDER BY trt_date ASC


这将返回2014年的所有治疗,无论该治疗是否是该患者的第一个治疗。我想从此列表中省略在2014年1月1日之前接受过治疗的任何人,并且只退还每人第一次治疗。例如,此代码返回2014年所有人的所有待遇。我只希望他们的第一个得到治疗,并且只有在有史以来第一次这样做。

谢谢。

最佳答案

 create table aThing
 (   oid int auto_increment primary key,
     fk_oid int not null,
     treatment int not null,
     trt_date date not null
 );

 insert aThing (fk_oid,treatment,trt_date) values
 (100,       19304,       '2011-05-24'),
 (100,       19304,       '2011-08-01'),
 (100,       19306,       '2014-03-05'),
 (200,       19305,       '2012-02-02'),
 (300,       19308,       '2014-01-20'),
 (400,       19308,       '2014-06-06');


select fk_oid,dt
from
(   select fk_oid,min(trt_date) as dt
    from aThing
    group by fk_oid
) xDerived
where year(dt)=2014;
+--------+------------+
| fk_oid | dt         |
+--------+------------+
|    300 | 2014-01-20 |
|    400 | 2014-06-06 |
+--------+------------+


内部部分(嵌套部分)成为派生表,并被命名为xDerived。这意味着,即使它只是一个结果集,通过使其成为派生表,也可以按名称引用它。因此,它不是物理表,而是派生表或虚拟表。

因此,派生表是具有聚合功能的非常简单的分组依据。它说,对于每个fk_oid,仅返回一行,仅返回1行,其最小值为trt_date.

因此,如果该表中有1000万行称为aThing,而fk_oid只有17个不同的值,则它将仅返回17行。每行是其trt_date的最小fk_oid

所以现在已经实现了,外包装上只显示了这两列(但要进行年度检查)。有一个复杂的原因可以解释为什么我必须这样做,所以我将在这里尝试这样做。

但是我可能需要一点时间来很好地解释它,所以请耐心等待。

这将是一种简短的说法。我必须将min放入别名,并且只有在派生表中解析后才能访问该别名,以便清理它(可以这么说),然后使用外部包装器对其进行访问。

聚合列的别名(例如as dt)不可用(作为别名的伪类列名称)...在where子句中不可用。但是通过将其包装在派生表名称中,可以说可以将其清除,然后可以在where子句中访问它。

因此,我无法在where子句中通过自己的查询直接访问它,但是当我将其包装在信封(派生表)中时,可以在外部访问它。

也许以后我会尝试更好地解释它,但是我将不得不展示获得结果访问权限的其他尝试,以及可能导致的语法错误。

10-04 12:38