假設我在表TestData中擁有醫院就診記錄
我想知道哪些病人在第一次住院后的7天內進行了第二次住院治療。我如何在SQL中進行編碼? 我把patient_id作為一個TEXT 日期是date_visit,也是TEXT,格式是MM/DD/YYYY
。A123B29134?
在上表中,患者A123B29133符合條件,因為他們在2011年7月14日就診,距離2011年12月7日不到7天
。uj5u.com熱心網友回復:
你可以使用一個帶有exists的子查詢:
with to_d(id, v_date) as (
select patient_id, substr(date_visit, 7, 4)||"-"|substr(date_visit, 1, 2)||"-"||substr(date_visit, 4, 2) from visits
)
select t2.id from (select t1.id, min(t1. v_date) d1 from to_d t1 group by t1.id) t2
where exists (select 1 from to_d t3 where t3. id = t2. id and t3.v_date != t2.d1 and t3. v_date <= date(t2.d1, ' 7 days'))
uj5u.com熱心網友回復:
由于你的日期列不是YYY-MM-DD,而YYY-MM-DD是幾個sqlite日期函式使用的默認值,所以使用substr函式將你的日期轉換為這種格式。JulianDay然后被用來將你的日期轉換為一個整數值,這將簡化7天的比較。MIN視窗函式被用來識別該病人的第一次醫院訪問日期。演示的fiddle和樣本顯示了用于轉換資料的查詢和最終查詢前的結果,最終查詢根據你的要求進行過濾,即< 7 days。通過這種使用視窗函式的方法,如果需要的話,你也可以檢索訪問日期和自第一次訪問日期以來的天數。
你可以閱讀更多關于sqlite日期函式這里.
。查詢 #1
SELECT
patient_id,
visit_date,
JulianDay(visit_date) -
MIN(JulianDay(visit_date) ) OVER (PARTITION BY patients_id)
as num_of_days_since_first_visit
FROM[/span
(
SELECT[/span
*,
(
substr(date_visit,7) || '-'/span> ||
substr(date_visit,0,3) || '-' ||
substr(date_visit,4,2)
) as visit_date
FROM
訪問
) v;
| Patient_id | 就診日期 | 自第一次就診以來的天數。||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| A123B29133? | 2011-07-12 | 0 | A123B29133? | 2011-07-14 | 2 | A123B29133? | 2011-07-20 | 8 | A123B29134? | 2016-12-05 | 0 |
| A123B29134 | 2016-12-05 | 0 |
查詢 #2
下面是你想要的查詢,它使用前面的查詢作為CTE,并對小于7天的訪問應用過濾器。num_of_days <> 0被應用于移除第一個日期也是記錄日期的條目。
WITH num_of_days_since_first_visit AS (
SELECT
patient_id,
visit_date,
JulianDay(visit_date) - MIN(JulianDay(visit_date) ) OVER (PARTITION BY patients_id) num_of_days
FROM[/span
(
SELECT[/span
*,
(
substr(date_visit,7) || '-'/span> ||
substr(date_visit,0,3) || '-' ||
substr(date_visit,4,2)
) as visit_date
FROM
訪問
) v
)
SELECTDISTINCT
病人_id
from
自第一次訪問以來的天數(num_of_days_since_first_visit
WHERE
num_of_days <> 0 AND num_of_days </span> 7;
| patient_id |
|---|
View on DB Fiddle
如果這對你有用,請告訴我。
uj5u.com熱心網友回復:
我想知道哪些病人在第一次住院后的7天內進行了第二次住院治療。
你可以使用lag()。 下面的內容可以得到所有這一點為真的記錄:
select t.*
from (select t.*,
lag(date_visit) over(partition by patients_id order by date_visit) as prev_date_visit
from t
) t
where prev_date_visit >= date(date_visit, '-7 day'/span>)。
如果你只想要patient_ids,你可以使用select distinct patient_id。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327125.html
標籤:
