-2

这是我的数据:

+----------+---------------+------------+---------------------+
|  doctor  | received_date | patient_id | accession_daily_key |
+----------+---------------+------------+---------------------+
|  A       |  1/1/2011     |  ABC123    |                   1 |
|  A       |  1/20/2011    |  AAA123    |                   2 |
|  A       |  1/21/2011    |  AAA123    |                   3 |
|          |               |            |                   4 |
|  A       |  2/1/2011     |  ABC123    |                   5 |
|  A       |  2/9/2011     |  BBBYYY    |                   6 |
|          |               |            |                   7 |
|  B       |  1/2/2011     |  ABC123    |                   8 |
|  B       |  1/20/2011    |  AXA435    |                   9 |
|  B       |  1/19/2011    |  AAA123    |                  10 |
|          |               |            |                  11 |
|  B       |  2/1/2011     |  ABC123    |                  12 |
|  B       |  2/10/2011    |  BBBYYY    |                  13 |
+----------+---------------+------------+---------------------+

这是我想要的结果:

+--------+-------+--------------------+
| doctor | month | count new patients |
+--------+-------+--------------------+
| A      |     1 |                  1 |
| A      |     2 |                  1 |
| B      |     1 |                  2 |
| B      |     2 |                  0 |
+--------+-------+--------------------+

我想为每个月的医生统计新病人。

我得到的业务规则是:

  1. 一名患者只能与一名医生相关联
  2. 与患者相关联的医生是最后一位看过他的医生

这是我到目前为止所拥有的:

select patient_id,max(month(RECEIVED_DATE)) AS Mnth, max(year(RECEIVED_DATE)) AS Yr, ACCESSION_DAILY_KEY
    FROM [F_ACCESSION_DAILY] 
    where RECEIVED_MLIS_INFORMATION=1
    GROUP BY patient_id,ACCESSION_DAILY_KEY

此查询将为我提供包含与患者相关联的医生的行的primary key accession_daily_key 。

您能否指导我如何获得每个月每个医生在该特定月份的新患者数量?


由 jcolebrand 编辑:

CREATE TABLE F_ACCESSION_DAILY (
    doctor VARCHAR(10) NOT NULL
  , received_date DATETIME NOT NULL
  , patient_id VARCHAR(10) NOT NULL
  , accession_daily_key INT NOT NULL
)

INSERT INTO F_ACCESSION_DAILY (doctor,received_date,patient_id,accession_daily_key) VALUES ('A','1/1/2011','ABC123','1')
INSERT INTO F_ACCESSION_DAILY (doctor,received_date,patient_id,accession_daily_key) VALUES ('A','1/20/2011','AAA123','2')
INSERT INTO F_ACCESSION_DAILY (doctor,received_date,patient_id,accession_daily_key) VALUES ('A','1/21/2011','AAA123','3')
INSERT INTO F_ACCESSION_DAILY (doctor,received_date,patient_id,accession_daily_key) VALUES ('A','2/1/2011','ABC123','5')
INSERT INTO F_ACCESSION_DAILY (doctor,received_date,patient_id,accession_daily_key) VALUES ('A','2/9/2011','BBBYYY','6')
INSERT INTO F_ACCESSION_DAILY (doctor,received_date,patient_id,accession_daily_key) VALUES ('B','1/2/2011','ABC123','8')
INSERT INTO F_ACCESSION_DAILY (doctor,received_date,patient_id,accession_daily_key) VALUES ('B','1/20/2011','AXA435','9')
INSERT INTO F_ACCESSION_DAILY (doctor,received_date,patient_id,accession_daily_key) VALUES ('B','1/19/2011','AAA123','10')
INSERT INTO F_ACCESSION_DAILY (doctor,received_date,patient_id,accession_daily_key) VALUES ('B','2/1/2011','ABC123','12')
INSERT INTO F_ACCESSION_DAILY (doctor,received_date,patient_id,accession_daily_key) VALUES ('B','2/10/2011','BBBYYY','13')
4

2 回答 2

4

您可能必须使用子查询分两步执行此操作:

  1. 获取所有新患者就诊的列表:

    选择医生,分钟(日期)作为首次就诊,患者从就诊中按患者分组;

  2. 按月分组汇总

    SELECT医生,COUNT(*),MONTH(firstvisit)作为月份,YEAR(firstvisit)作为年份(...)按医生分组,MONTH(firstvisit),YEAR(firstvisit);

综上所述,以下应该可以工作:

SELECT doctor, COUNT(*) newPatients, MONTH(firstvisit) AS month, YEAR(firstvisit) AS year FROM 
        (SELECT doctor, MIN(date) AS firstvisit ,patient FROM visits GROUP BY patient)
    GROUP BY doctor, MONTH(firstvisit), YEAR(firstvisit);

没有子查询也可以做到这一点,但我不确定它是否能正常工作。

好的,编辑更新:

您现在需要四个(?)步骤:

  1. 确定每位患者的最后一次就诊

    SELECT 患者,MAX(date) lastvisit FROM 就诊 GROUP BY 患者;

  2. 确定每个专利的相关医生,作为最后一次访问的医生:

    从就诊中选择医生、患者 v LEFT JOIN (...) lv ON v.patient=lv.patient WHERE v.date=lv.lastvisit;

  3. 确定与最新医生的首次就诊

    选择医生,患者,MIN(日期)firstvisit FROM访问v LEFT JOIN(...)dp ON v.doctor = dp.doctor WHERE v.patient = dp.patient GROUP BY患者;

  4. 像以前一样总结每个医生每月的第一次访问:

    SELECT医生,COUNT(*),MONTH(firstvisit)作为月份,YEAR(firstvisit)作为年份(...)按医生分组,MONTH(firstvisit),YEAR(firstvisit);

给出一个有点可怕且效率可疑的总数:

SELECT doctor, COUNT(*), MONTH(firstvisit) AS month, YEAR(firstvisit) AS year 
    FROM (
    SELECT doctor, patient, MIN(date) firstvisit
        FROM visits v 
        LEFT JOIN (
            SELECT doctor, patient FROM visits v 
                LEFT JOIN (
                    SELECT patient, date lastvisit 
                        FROM visits GROUP BY patient) lv 
                ON v.patient=lv.patient 
                WHERE v.date=lv.lastvisit) dp 
        ON v.doctor=dp.doctor
        WHERE v.patient=dp.patient
        GROUP BY patient) 
    GROUP BY doctor, MONTH(firstvisit), YEAR(firstvisit);

我再次认为这可能至少可以压缩一点。

EDIT2:感谢 jcolebrand,工作 SQL:http ://sqlfiddle.com/#!3/41beb/25

SELECT
       t.doctor
     , COUNT(t.doctor)
     , MONTH(t.firstvisit) AS MONTH
     , YEAR(t.firstvisit) AS YEAR
  FROM (
    SELECT
           v.doctor
         , v.patient_id
         , MIN(received_date) firstvisit
      FROM F_ACCESSION_DAILY v
 LEFT JOIN (
            SELECT
                   v.doctor
                 , v.patient_id
              FROM F_ACCESSION_DAILY v
         LEFT JOIN (
                    SELECT patient_id
                         , received_date lastvisit
                      FROM F_ACCESSION_DAILY
                  GROUP BY patient_id
                         , received_date
                  ) lv ON v.patient_id=lv.patient_id
             WHERE v.received_date=lv.lastvisit
          ) dp ON v.doctor = dp.doctor
    WHERE v.patient_id=dp.patient_id
    GROUP BY v.patient_id
           , v.doctor
  ) t
 GROUP BY
       t.doctor
     , MONTH(t.firstvisit)
     , YEAR(t.firstvisit);
于 2012-09-14T18:10:41.500 回答
4

请注意,这是在他的第一次信息迭代中,并且由于 Zeb 已经在进一步的答案方面做得很好,因此出于历史追溯的原因,我将离开此。随意忽略这个有利于他的答案,但对于迭代过程,这是一个很好的学习示例。

我认为这似乎应该满足您的需求

SELECT
       MIN(received_date) AS FirstVisit
     , patient_id         AS PatientID
INTO #LookupTable
FROM F_ACCESSION_DAILY

SELECT 
       f.doctor           AS Doctor
     , COUNT(f.*)         AS CountNewPatients
     , MONTH(firstvisit)  AS Month
     , YEAR(firstvisit)   AS Year
FROM F_ACCESSION_DAILY f 
INNER JOIN #LookupTable l ON f.received_date = l.FirstVisit 
                         AND f.patient_id = l.PatientID
GROUP BY f.doctor
       , MONTH(firstvisit)
       , YEAR(firstvisit)

DROP TABLE #LookupTable
于 2012-09-14T18:13:10.653 回答