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

时间:2014-03-16 01:13:18

标签: 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, '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中编写查询吗?感谢您的帮助!

2 个答案:

答案 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。可能是因为我个人特殊的编码经验,在这种情况下我很难掌握两次使用连接。我上面的代码是一种解决它的方法。我希望这个答案可以帮助其他类似我的人。