我有一个虚拟数据集,如下所示,它是一个记录每位患者标本结果的数据集:
case_id specimen_type_id virus_id specimen_result specimen_collection_date
1 1 4 positive 25/12/2014
1 1 5 positive 25/12/2014
1 1 4 negative 21/01/2015
1 2 4 negative 21/01/2015
1 1 4 negative 23/01/2015
1 2 4 negative 23/01/2015
1 1 4 positive 25/01/2015
1 1 4 negative 26/01/2015
1 1 4 negative 27/01/2015
1 1 5 negative 27/01/2015
case_id
是指患者的身份
specimen_type_id
是指所取样本的类型,无论是血样,痰样本等
virus_id
是我们正在寻找的病毒类型
specimen_result
是标本是否发现了病毒(阳性)或不发现(阴性)
specimen_collection_date
是取样的时候。
我需要一个显示每位患者的清单:i)最近的连续阴性标本计数(即中间的阳性结果,需要再次计数),ii)最新连续阴性标本的最新日期。如下所示:
case_id virus_id specimen_type_id count latest_specimen_collection_date
1 4 1 2 27/01/2015
1 5 1 1 27/01/2015
输出基于我示例中数据集的最后3行。
我是MySQL的新手,我搜索了MySQL consecutive
,代码对我来说有点神秘,有人可以帮忙吗?谢谢!
答案 0 :(得分:0)
以下查询主要解决您的问题。它为特定病例,病毒和特定类型创建了一系列连续相同结果的“运行”列表。
set @runn = 0;
set @runv = 'xxx';
SELECT specruns.*,count(*) cnt,MIN(specruns.speciman_date) mindate,MAX(specruns.speciman_date) maxdate
FROM
(
SELECT
IF(@runv = CONCAT(s.case_id,s.speciman_type_id,s.virus_id,s.speciman_result ) ,@runn,@runn:=@runn+1) run,
@runv := CONCAT(s.case_id,s.speciman_type_id,s.virus_id ,s.speciman_result) val,
s.* FROM specs s
ORDER BY s.case_id,s.speciman_type_id,s.virus_id ,s.speciman_date
) specruns
GROUP BY specruns.run