我想从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子句中通过自己的查询直接访问它,但是当我将其包装在信封(派生表)中时,可以在外部访问它。
也许以后我会尝试更好地解释它,但是我将不得不展示获得结果访问权限的其他尝试,以及可能导致的语法错误。