我已经阅读了几个关于计算连续行的类似问题,但没有一个给我一个明确的答案。我希望有人可以帮我解决一下我的问题。我有下表作为例子。
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和日期列非常明显。最后一列,TookTest是二进制指示符列,其中1表示患者参加测试,否则为0。在创建此表时,对患者ID和日期进行排序。我想计算连续至少3次接受检查的患者人数。在我们的示例中,PatientID 1和3进行了3次或更多次测试。所以答案是2.有人能告诉我如何在MySQL中编写查询吗?感谢您的帮助!
答案 0 :(得分:5)
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.这就是你要求的.....见如果您有疑问http://sqlfiddle.com/#!2/22ba28/12
,那就是小提琴答案 1 :(得分:1)
此代码也有效。
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。可能是因为我个人特殊的编码经验,在这种情况下我很难掌握两次使用连接。我上面的代码是一种解决它的方法。我希望这个答案可以帮助其他类似我的人。