Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:计算具有相同值的连续行数_Mysql - Fatal编程技术网

MySQL:计算具有相同值的连续行数

MySQL:计算具有相同值的连续行数,mysql,Mysql,我读过一些关于连续行数的类似问题,但没有一个能给我一个明确的答案。我希望有人能帮我解决这个问题。我以下表为例 create table medical (PatientID int, Date Date, TookTest int ); insert into medical(PatientID, Date, TookTest) values (1, '2014-01-01', 1), (1, '2014-01-05', 1), (1, '2014-01-10', 1), (2,

我读过一些关于连续行数的类似问题,但没有一个能给我一个明确的答案。我希望有人能帮我解决这个问题。我以下表为例

create table medical
 (PatientID int,
  Date Date,
  TookTest int
 );

insert into medical(PatientID, Date, TookTest)
values
(1, '2014-01-01', 1),
(1, '2014-01-05', 1),
(1, '2014-01-10', 1),
(2, '2014-01-01', 1),
(2, '2014-01-10', 0),
(2, '2014-01-20', 1),
(3, '2014-01-01', 1),
(3, '2014-01-07', 1),
(3, '2014-01-12', 1),
(3, '2014-01-21', 1),
(4, '2014-01-03', 1),
(4, '2014-01-05', 1),
(4, '2014-01-22', 0),
(4, '2014-01-27', 1)
此表用于确定哪些患者在特定日期进行了体检。PatientID和date列是非常不言自明的。最后一列TookTest是一个二进制指示符列,其中1表示患者进行了测试,否则为0。patientID和日期在创建此表时进行排序。我想统计一下连续至少3次接受检测的患者人数。在我们的示例中,PatientID 1和3进行了3次或更多测试。所以答案是2。有人能告诉我如何在MySQL中编写查询吗?提前谢谢你的帮助

SELECT 
    m_id 
FROM(
    SELECT
        m.PatientID AS m_id,
        m.Date AS m_date,
        m.TookTest,
        IF(m.TookTest = 1 AND @b = m.PatientID, @a := @a +1, @a := 0) AS new_count,
        @b := m.PatientID
    FROM medical m
JOIN (
    SELECT 
        @a := 0, 
        @b := 0
    ) AS t
  ) AS TEMP
WHERE new_count >= 2
GROUP BY m_id

这是你的计算结果。。唯一的问题是它看起来有点奇怪,因为计数从0开始,而不是从1开始,所以如果连续3次,计数将是2。这符合你的要求。。。。。如果您有问题,请查看小提琴

此代码也适用

set @test = 0, @id=0, @count=0;

select m.id, max(count)
from (
select 
 @count := if(TookTest = 1 and PatientID = @id, @count+1, 0) as count,
 @test := Tooktest,
 @id := PatientID as id
from medical) as m
group by m.id
having max(count) >=2;
此代码统计TookTest的历史最大连续行数,而不是最近的连续行数(此区别在此处不相关,因为示例数据太小,无法在最近的连续行数和历史最大连续行数之间产生任何差异。)


我的编码背景是R、Python和Java。可能是因为我个人特殊的编码经验,在这种情况下,我很难掌握两次使用join。我上面的代码是一种绕过它的方法。我希望这个答案能帮助其他类似情况的人,比如我。

在最后一行的第二行,new\u count>2?它是new\u count>=2。谢谢是的,一旦它达到2,它已经经历了3次(因为第一个实例从0开始),所以>=2。。。这能解决你的问题吗?