我遇到了一些問題,我無法真正解決問題。
我有一個帶有通氣持續時間時間戳的表,其中包含以分鐘為單位的不同發作的整個持續時間,其中患者接受通氣以及一些其他資料 患者病例 ID 的鍵。
以下是該表的示例:
| PK | 案例ID | 期間 | 開始 | 結尾 |
|---|---|---|---|---|
| 1 | 1 | 45860 | 2018-01-13 12:15:00 | 2018-02-14 08:35:00 |
| 2 | 1 | 132 | 2018-01-11 11:45:00 | 2018-01-13 12:15:00 |
因此,如您所見,一個案例在此表中可以有多行。現在在另一個表中,我有患者/病例在住院期間(從入院到出院)所在的部門和站點——也有時間戳:
| PK | 案例ID | 開始 | 結尾 | 站號 |
|---|---|---|---|---|
| 1 | 1 | 2018-01-13 11:53:00 | 2018-01-13 12:11:00 | 123 |
| 2 | 1 | 2018-01-13 12:11:00 | 2018-02-18 10:59:00 | 123 |
| 3 | 1 | 2018-02-25 09:15:00 | 2018-02-26 11:27:00 | 123 |
| 4 | 1 | 2018-02-26 11:27:00 | 2018-03-01 10:04:00 | 123 |
| 5 | 1 | 2018-03-01 11:06:00 | 2018-03-03 14:25:00 | 234 |
現在我想建立一個查詢來總結特定站的通風時間。如您所見,我在第一個表中沒有參考站,因此我必須比較時間戳以獲取我們在該特定站上的時間(例如 - 像這里 - ID 為 123)。
我想我得到的邏輯是,通風的開始必須大于或等于車站訪問的開始,結束必須小于或等于車站訪問的結束,但我不確定如何處理那些多次入住(例如重新入院時)。
我想出了以下似乎有效的查詢,但在我看來,數字有點偏低:
@set start_date = '01.01.2018 00:00:00'
@set end_date = '31.08.2021 23:59:59'
@set format = 'DD.MM.YYYY HH24:MI:SS'
SELECT
"Year",
SUM("Ventilation Duration") AS "Sum"
FROM
(SELECT
f.CASEID AS "FallID",
SUM(DECODE(fb.DURATION, 20 , ROUND(fb.DURATION / 60, 0), 21, fb.DURATION)) AS "Ventilation Duration",
TO_CHAR(fa.BEGIN, 'DD.MM.YYYY HH24:MI') AS "Begin Station Stay",
TO_CHAR(fb.BEGIN, 'DD.MM.YYYY HH24:MI') AS "Begin Ventilation",
TO_CHAR(fb.END, 'DD.MM.YYYY HH24:MI') AS "End Ventilation",
TO_CHAR(fa.END, 'DD.MM.YYYY HH24:MI') AS "End Station Stay",
oe.STATION_NAME AS "Station",
TO_CHAR(f.DISCHARGE_DATE, 'YYYY') AS "YEAR"
FROM
CASE_VENTLATION fb
INNER JOIN
CASE_STAY fa ON fa.CASEID = fb.CASEID
INNER JOIN
CASE f ON f.CASEID = fb.CASEID
INNER JOIN
STATION oe ON oe.STATIONID = fa.STATIONID
WHERE
f.STORNO_DATUM IS NULL
AND f.DISCHARGE_DATE BETWEEN TO_DATE(:start_date, :format) AND TO_DATE(:end_date, :format)
AND fa.STATIONID = 10097
AND f.CASEMARK IN (38140, 38142)
AND fb.BEGIN >=(SELECT MIN(fa.BEGIN)FROM CASE_STAY fa2 WHERE fa2.CASEID = fb.CASEID AND fa2.STATION_ID = fa.STATION_ID)
AND fb.END <= SELECT MAX(fa.ENDE)FROM CASE_STAY fa2 WHERE fa2.CASEID = fb.CASEID AND fa2.STATION_ID = fa.STATION_ID)
GROUP BY
...
)
GROUP BY "Year"
ORDER BY "Year"
你認為這在邏輯上是正確的,還是我可以寫一個更好的 WHERE-Condition - 特別是對于 MIN 和 MAX 函式。
Don't mind the aliases, I translated some field names from German so it's easier to understand to what fields in the example they refer.
EDIT: As requested, this is my current result:
| Year | Sum |
|---|---|
| 2018 | 23412 |
| 2019 | 35618 |
| 2020 | 25633 |
| 2021 | 19682 |
Problem is, as I said, it's a bit on the lower side and I guess I missed some due to those timestamp overlaps :/.
Any help is greatly appreciated!
Thanks!
uj5u.com熱心網友回復:
老實說,我不完全確定我是否正確地完成了任務,但它似乎很有趣,所以我會嘗試。對不起,如果我錯了。
如果您只需要計算每個站點對患者進行通氣的分鐘數,這就是我所擁有的:
select st.station_id,
v.caseid,
sum((least(v.end_date, st.end_date) - greatest(v.begin_date, st.begin_date)) * 24 * 60) vent_duration_mins
from vent v
join dep_stat st
on v.caseid = st.caseid
and v.begin_date < st.end_date
and v.end_date > st.begin_date
group by st.station_id,
v.caseid
這種情況假設所有日期列都是日期型別,而不是時間戳
db_fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/327523.html
上一篇:如何使用子查詢獲取查詢結果
