首先讓我
簡單地解釋一下我的模式一個醫生為一個病人
開處方 每個處方都有多種藥物 每個藥物都有一個頻率(每 X 小時服用一次)
并且還有一個開始和結束
我在我的表格中添加了SQL Fiddle
我的要求是遍歷表格并為每個處方
創建一個報告(存盤程序)
前患者 1 從 20-11-2021 20:00 每 6 小時服用一次藥物 1,持續 2 天
Patient Drug Dose
1 1 1 / 20-11-2021 20:00 (Dose Number / Dose Datetime)
1 1 2 / 21-11-2021 02:00 (Add 6 hour to get next dose)
1 1 3 / 21-11-2021 08:00
1 1 4 / 21-11-2021 14:00
這是我的示例查詢
DECLARE @minDate datetime , @MaxDate datetime,
@CurrDate datetime,@index int,@hour int
SELECT @minDate = min(startdate),
@MaxDate = max(EndDate) ,
@hour=max(Frequency.HourValue)
FROM Prescription_Detail
inner join Frequency on Prescription_Detail.FreqID = Frequency.Id
WHERE Prescription_Detail.Id = 1
set @CurrDate = @minDate
set @index = 1
while @CurrDate <= @MaxDate
begin
PRINT CONVERT(varchar, @index) '/' CONVERT(VARCHAR, @CurrDate)
set @CurrDate = DATEADD(HOUR, @hour, cast(@CurrDate as datetime))
set @index = @index 1
end
根據第一條評論,我將更具體的
第一個表患者
第二個表處方(與患者一對一)
第三個表處方詳細資訊(表處方的詳細資訊)
該表包含藥物及其開始日期(日期欄位)開始時間(時間欄位)結束日期,結束時間,頻率ID(與表頻率一對一)
第四個表頻率有小時數
我對每種藥物的要求基于開始日期和時間以及頻率和結束日期和時間
計算劑量和每次劑量的時間
我都更新了 Fiddler
謝謝
接受的解決方案基于數字表,請參閱此鏈接了解詳細資訊
uj5u.com熱心網友回復:
您不需要游標或 while 回圈。你只需要一張number / tally桌子。
您可以使用永久的一個或使用動態創建一個recursive cte。下面的查詢使用永久編號表
的cross apply是計算StartDateTime從StartDate和StartTime到簡化進一步的計算
從StartDateTime和EndDateTime與劑量頻率一起,您可以計算所需的劑量總數
select p.id, d.DrugID,
Dose_No = n.n 1,
Dose_DateTime = dateadd(hour, n * f.HourValue, dt.StartDateTime)
from Patient p
inner join Prescription r on r.PatientID = p.id
inner join Prescription_Detail d on d.PrescriptionID = r.id
inner join Frequency f on d.FreqID = f.id
cross apply
(
select StartDateTime = cast(d.StartDate as datetime) cast(d.StartTime as datetime),
EndDateTime = cast(d.EndDate as datetime) cast(d.EndTime as datetime)
) dt
inner join number n on n.n <= datediff(hour, dt.StartDateTime, dt.EndDateTime) / f.HourValue
order by p.id, d.DrugId, Dose_no
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/361398.html
標籤:sql sql-server
