Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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 在医疗保健数据集上创建4个SQL查询,称为四切分方法_Mysql_Sql - Fatal编程技术网

Mysql 在医疗保健数据集上创建4个SQL查询,称为四切分方法

Mysql 在医疗保健数据集上创建4个SQL查询,称为四切分方法,mysql,sql,Mysql,Sql,我有一个包含7万多行的表,类似于下面的数据 id | patient | date | provider ________________________________ 1 | bob | 2020-2-1 | dr joe 1 | bob | 2020-1-1 | dr joe 2 | tom | 2020-4-1 | dr ann 2 | tom | 2020-3-1 | dr joe 2 | tom | 2020-2-1 | d

我有一个包含7万多行的表,类似于下面的数据

id | patient |  date    | provider
________________________________
1  |   bob   | 2020-2-1 | dr joe
1  |   bob   | 2020-1-1 | dr joe

2  |   tom   | 2020-4-1 | dr ann
2  |   tom   | 2020-3-1 | dr joe
2  |   tom   | 2020-2-1 | dr joe

3  |   jan   | 2020-6-1 | dr ann
3  |   jan   | 2020-5-1 | dr ann
3  |   jan   | 2020-4-1 | dr joe
3  |   jan   | 2020-3-1 | dr joe

4  |   ken   | 2020-6-1 | dr ted
4  |   ken   | 2020-5-1 | dr ann
4  |   ken   | 2020-4-1 | dr joe
我需要从数据中提取以下报告

  • 在过去一年中只看过一家医疗机构的患者。(例如,id 1)
  • 在过去一年的大部分时间里,患者曾见过多个提供者,但其中一个提供者。(例如,id 2)
  • 在过去一年中平等地看了两个或两个以上提供者的患者(无法确定多数提供者)。(例如,id 3)
  • 看过多个提供者的患者。(例如,id 4)
  • 我正在使用MySQL,自从使用SQL以来已经有一段时间了,我希望能得到一些关于如何从表中提取特定数据的建议


    下面是所需数据的示例。

    这有点棘手,但您可以使用两个级别的聚合窗口函数:

    select patient,
           (case when max_cnt = total_cnt then 'One provider'
                 when max_cnt > 0.5 * total_cnt then 'One dominant provider'
                 when avg_cnt = max_cnt then 'Multiple equal'
                 else 'Two or more'
            end) as grouping
    from (select patient, provider, count(*) as cnt,
                 avg(count(*)) over (partition by patient) as avg_cnt,
                 max(count(*)) over (partition by patient) as max_cnt,
                 sum(count(*)) over (partition by patient) as total_cnt
          from t
          where date > curdate - interval 1 year
          group by pateint, provider
         ) pp
    group by patient;
    
    编辑:

    对于只看过一次的患者,只需使用聚合:

    select patient
    from t
    group by patient
    having max(provider) = min(provider);
    

    如果你想的话,你可以用一个
    where
    子句来限制时间范围。

    非常感谢你,但我仍然在努力。如果可能的话,你会发布如何找到“只看过一个提供者的患者”吗?结果将是耐心的“鲍勃”。非常感谢你,工作完美!我想问一下也无妨,如果您能为报告2和报告3提供任何帮助,我们将不胜感激。我从表中删除了所有旧条目,因此日期/时间不再重要。例如,“看过多个提供者的患者,但大部分时间只有一个提供者。”@FHC。一个问题应限于一个问题。最初的答案实际上解决了所有四个问题。