仕事:
- 以下の現在動作中のコードを追加/編集して、患者ごとに 1 つの行のみを返すようにします。
d1_10.xtransfer
(データ型 int) の最大値は、この行のd1_10.dstartdate <= glob_End_Date
.
警告:
StackOverflow とその姉妹サイトにも同様の質問があります。この問題の解決に成功したものはありません。
これは医療用 EHR データベースです。コードを共有できますが、結果に関する議論は一般的なもので、患者情報を除外する必要があります。
既存の Excel スプレッドシート内の SQL クエリを置き換えて、別のことを行います。Excel は、ODBC 接続を使用してデータベースから情報を取得します。私たちのデータベースは Ingres SQL を使用しており、一般的な SQL コードの種類のすべてではありませんがほとんどを受け入れます。コードの一部は通常、他の種類の SQL では機能しますが、Ingres と Excel の組み合わせでは機能しない可能性があります。スプレッドシートが機能し、結果が返されるようになりました。次は、このソフトウェアで機能する SQL コードを作成して修正することです。
これまで:
以下の現在動作しているコード (最大制限なし) を使用すると、ユーザーが選択した日付範囲とユーザーが選択したd1_10.xtransfer
すべての行が返されます。最新のものだけが必要です。つまり、日付範囲内の最大値、または日付範囲内の最大値(追加されるとカウントアップされるインデックス) を持つ患者の行です。d1_10.dstartdate
d1_10.xinstitute
d1_10.dstartdate
d1_10.xtransfer
現在作業中のコード:
"SELECT " & _
"d1.xpid ""XPID"", " & _
"d0_v1.name_family ""NAME_FAMILY"", " & _
"d0_v1.name_given1 ""NAME_GIVEN1"", " & _
"d0_v1.name_given2 ""NAME_GIVEN2"", " & _
"d1.sex ""SEX"", " & _
"d1.birthdate ""DOB"", " & _
"d0_v1.hsp_pid, " & _
"c58.brief_name, " & _
"c73.cname, " & _
"date_trunc('day',d1_10.dstartdate) ""DSTARTDATE"", " & _
"date_trunc('day',d1_17.ddeath) ""DDEATH"" " & _
"FROM d1 " & _
"JOIN d0_v1 ON d1.xpid = d0_v1.xpid " & _
"JOIN d1_2 ON d1.xpid = d1_2.xpid " & _
"JOIN c58 ON d1_2.xmodality = c58.xcmodality " & _
"JOIN d1_10 ON d1.xpid = d1_10.xpid " & _
"JOIN c73 ON d1_10.xinstitute = c73.xcsite " & _
"JOIN d1_17 ON d1.xpid = d1_17.xpid " & _
"WHERE " & _
"d1_10.xinstitute = " & institute_index & " AND " & _
"d1_10.dstartdate >= '" & glob_Start_Date & " 00:00:00' and " & _
"d1_10.dstartdate <= '" & glob_End_Date & " 23:59:59' "
Excel スプレッドシートから実行するコードで最も近いのは、WHERE 句に次の行を追加した場合です。
d1_10.xtransfer = (SELECT MAX(d1_10.xtransfer) FROM d1_10 GROUP BY xpid)
この追加行によりd1_10.xtransfer
、日付範囲内にある各患者から 1 行のみが返されます。ただしd1_10.xtransfer
、日付範囲より新しい行がある場合、それらは結果にまったく表示されません。
この行により、コードはMAX(d1_10.xtransfer)
日付制限を適用する前に各 xpid を取得します。私の論理では、代わりに後で実行することを望んでいますが、これよりも近づくように実行するコードを思いつくことができませんでした。
前もって感謝します。この改ページの下に追加情報を追加して、この質問を更新し続けます。
追加情報:
- PaulM ごとに:
はい、xpid
各患者に固有の患者 ID インデックス番号です。
WHERE 句の行を次のように追加/編集:"d1_10.xtransfer = (SELECT MAX(xtransfer) FROM d1_10 d1_10_b WHERE d1_10.xpid = d1_10_b.xpid AND d1_10_b.dstartdate <= '" & glob_End_Date & " 23:59:59') "
患者 Bob は、6 月 14 日と 17 日の両方に、残りの基準に適合する転院があります。
終了日が 6 月 17 日以降の日付範囲を入力すると、スプレッドシートはボブの 6 月 17 日の転勤の行を正しく返します。
終了日が 6 月 14、15、または 16 の日付範囲を入力すると、スプレッドシートは誤って Bob の行を返しません。
日付で制限する前に、まだ最大の xtransfer を使用しているようです。
- PaulM のコメントによると:
次のように、特定の患者のサブセレクトを実行しました。
入力:
SELECT MAX(xtransfer) FROM d1_10 d1_10_b WHERE d1_10_b.xpid = '2258' AND d1_10_b.dstartdate <= '20-apr-2016 23:59:59'
の値を出力しましたMAX(xtransfer) = '48233'
。これは正しいです。
そのため、Visual SQL を独自のステートメントとして実行しd1_10_b.xpid
、特定の患者に等しく設定すると、日付範囲から最大 xtransfer が正しく取得されます。(xtransfer
日付範囲外の最新のデータがありましたが、日付範囲内の最大値が正しく表示されていましたxtransfer
。)
次に、スプレッドシートの近くにあるこのまったく同じサブセレクトを実行してみました。つまり、同じ日付範囲 (変数として正しく正常に渡されている) を手動で選択しましたがd1_10.xpid = d1_10_b.xpid
、d1_10_b.xpid = '2258'
. これはうまくいきませんでした。サブクエリの日付範囲で制限する前に MAX() 関数を適用しているため、スプレッドシートにはこの患者の行が表示されませんでした。それでも、サブクエリは単独で実行すると機能します。
さらなる提案に感謝します。