计算MySQL中的“最新”连续计数

时间:2015-03-11 02:46:53

标签: mysql

我有一个虚拟数据集,如下所示,它是一个记录每位患者标本结果的数据集:

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,代码对我来说有点神秘,有人可以帮忙吗?谢谢!

1 个答案:

答案 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