-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. 患者は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

おそらく、サブクエリを使用して 2 つの手順でこれを行う必要があります。

  1. すべての新規患者の訪問のリストを取得します。

    SELECT doctor, MIN(date) AS firstvisit ,patient FROM visits GROUP BY 患者;

  2. 月ごとにまとめてみる

    SELECT doctor, COUNT(*), MONTH(firstvisit) AS month, YEAR(firstvisit) AS year FROM (...) GROUP BY doctor, 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);

サブクエリなしでこれを行うことは可能かもしれませんが、それが適切に機能するかどうかはわかりません。

OK、編集済みの更新:

次の 4 つの (?) ステップが必要です。

  1. 各患者の最終来院を決定する

    SELECT 患者、MAX(日付) lastvisit FROM 訪問 GROUP BY 患者;

  2. 最後の診察を行った医師として、各特許の関連医師を決定します。

    SELECT 医師、患者 FROM 訪問 v LEFT JOIN (...) lv ON v.patient=lv.patient WHERE v.date=lv.lastvisit;

  3. 最新の医師との最初の訪問を決定する

    SELECT 医師、患者、MIN(日付) firstvisit FROM 訪問 v LEFT JOIN (...) dp ON v.doctor=dp.doctor WHERE v.patient=dp.patient GROUP BY 患者;

  4. 前と同じように、各医師の 1 か月あたりの初診回数を合計します。

    SELECT doctor, COUNT(*), MONTH(firstvisit) AS month, YEAR(firstvisit) AS year FROM (...) GROUP BY doctor, 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 に答える