2015-02-03 2 views
1

У меня есть временная таблица, # TEMP1, которая возвращает следующую дату лечения для пациентов и общее количество запланированных обработок в заданную дату ассортимент. В пределах временной таблицы значение, которое дает мне минимальное количество дней между каждым лечением.SQL Server - прокрутите временную таблицу и вычислите несколько значений, чтобы вставлять строки во вторую таблицу.

Что мне нужно сделать, это взять следующую дату лечения, определить, сколько запланированных процедур проводится после следующей даты лечения и заполнить вторую временную таблицу, # TEMP2, с запланированными датами.

Например, в # TEMP1, содержит следующие данные:

patient next_tx_dt planned_tx_cnt min_days_bt start_range end_range 
PATIENT_1 2/15/2015 4    28   2/1/2015  6/1/2015 
PATIENT_2 2/05/2015 9    12   2/1/2015  6/1/2015 
PATIENT_3 5/17/2015 1    112   2/1/2015  6/1/2015   

Я хотел бы цикл через # TEMP1 и для каждой строки, вычислить даты планируемого лечения. Таким образом, одна строка может быть зациклирована один раз (PATIENT_3) или девять раз (PATIENT_2), и каждый цикл приводит к новой строке в # TEMP2.

PATIENT_1 будет иметь следующие результаты в # ТЕМР2 после успешного цикла:

pat_id  planned_tx_dt planned_tx_cnt 
PATIENT_1 2/15/2015  1 
PATIENT_1 3/15/2015  2 
PATIENT_1 4/12/2015  3 
PATIENT_1 5/10/2015  4 

PATIENT_2 будет иметь 9 строк и PATIENT_3 будет иметь только 1 строку в # ТЕМР2.

Возможно ли это сделать в SQL Server 2008? Я делал очень простые циклы, прежде чем использовать число строк, но это технически не происходит через таблицу, поэтому я не уверен, как это начать или если это возможно (у меня нет большого опыта написания передовых SQL-код).

+0

в вашем наборе данных # TEMP2, как вы рассчитываете 'запланированный_tx_dt' из данных в # TEMP1? – SoulTrain

+0

В моем примере я просто вручную подсчитал дату, но я думаю, что для запроса было бы связано с установкой # TEMP1.planned_tx_cnt вверх как переменной, а затем какой-то цикл для вычисления каждой строки? Например, SET @TX_CNT = # TEMP1.planned_tx_cnt. – katstart

+0

ВЫБОР @I = 1 ВЫБОР @TX_CNT = # TEMP1.planned_tx_cnt While (@I <= @TX_CNT) НАЧАТЬ DATEADD (д, (# TEMP1.min_days_bt * @I), # TEMP1.next_tx_dt) ВЫБОР @ I = @I + 1 END – katstart

ответ

0

Убедитесь, что вы прочитали ссылку, которую я разместил. Между тем вот функциональный пример с использованием информации, которую вы опубликовали. У меня на самом деле есть это cteTally как представление в моей системе, поэтому мне не нужно его воссоздавать. Вы можете отрегулировать часть cte по мере необходимости, чтобы у вас было достаточно строк.

if OBJECT_ID('tempdb..#temp1') is not null 
    drop table #temp1 

create table #temp1 
(
    patient varchar(50) 
    , next_tx_dt date 
    , planned_tx_cnt int 
    , min_days_bt int 
    , start_range date 
    , end_range date  
) 

insert #temp1 
select 'PATIENT_1', '2/15/2015', '4', '28', '2/1/2015', '6/1/2015' union all 
select 'PATIENT_2', '2/05/2015', '9', '12', '2/1/2015', '6/1/2015' union all 
select 'PATIENT_3', '5/17/2015', '1', '112', '2/1/2015', '6/1/2015'; 

WITH 
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)), 
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
    cteTally(N) AS 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
    ) 

select *, DATEADD(DAY, (N - 1) * min_days_bt, next_tx_dt) 
from #temp1 t1 
join cteTally t on t.N <= t1.planned_tx_cnt 
--where t1.patient = 'PATIENT_1' 
+0

Спасибо, ваш пример на самом деле помогает мне понять статью немного лучше - абсолютно новая территория для меня! – katstart

+0

Если вы читаете эту статью и понимаете, что она говорит, а затем понимаете этот код, это изменит способ просмотра данных. Рад, что мой пример помог. –

Смежные вопросы