2013-07-12 4 views
2

В моей ситуации, я хочу, чтобы извлечь дату начала и остановки Дата из следующей таблицы, как вы можете видеть, у меня есть только 1 Дата столбец, который содержит Start/Изменить/Stop Дата, которая зависит от ACTION колонки:SQL-запрос для извлечения дат из таблицы на основе значения другого столбца в той же таблице?

01 - Start (New drug start) 
02 - Change (Change of dose) 
03 - Stop (Drug Stopped) 

сложный бит заключается в том, что когда действие Действие = 02 изменяется, поэтому дата изменения должна быть датой начала текущей дозы и датой остановки для пребиотической дозы.

Я действительно путают с ним ,,

CREATE TABLE TEST(ID VARCHAR(10), [TherapyAction] INT, [Drug] INT, [Dose] FLOAT, [TherapyDate] DATETIME) 

INSERT INTO [dbo].[TEST] VALUES ('XXX' ,1, 1, 60, '01/09/2009 '), 
           ('57A' ,3, 1, 60, '09/07/2011'), 
           ('57A' ,1, 3, 5, '25/06/2010'), 
           ('57A' ,3, 3, 5, '09/07/2011'), 
           ('57A' ,1, 4, 187.5, '19/02/2010'), 
           ('57A' ,2, 4, 250, '01/06/2010'), 
           ('57A' ,3, 4, 250, '09/07/2011'), 
           ('A5B' ,1, 1, 12.5, '26/01/2007'), 
           ('A5B' ,2, 1, 25, '06/02/2007'), 
           ('A5B' ,2, 1, 225, '20/08/2009'), 
           ('A5B' ,1, 4, 62.5, '04/07/2006'), 
           ('A5B' ,2, 4, 125, '12/07/2006'), 
           ('A5B' ,2, 4, 250, '01/05/2008'), 
           ('A5B' ,1, 7, 7.5, '11/09/2006'), 
           ('A5B' ,3, 7, 7.5, '26/01/2007'), 
           ('A5B' ,1, 7, 9, '09/04/2010'), 
           ('A5B', 3, 7, 9, '19/07/2010') 

SELECT * FROM [dbo].[TEST] 

Любая помощь будет принята с благодарностью

ответ

1
set dateformat dmy 
declare @test TABLE (ID VARCHAR(10), [TherapyAction] INT, 
        [Drug] INT, [Dose] FLOAT,  
        [TherapyDate] DATETIME) 
INSERT INTO @test VALUES ('XXX' ,1, 1, 60, '01/09/2009 '), 
          ('57A' ,3, 1, 60, '09/07/2011'), 
          ('57A' ,1, 3, 5, '25/06/2010'), 
          ('57A' ,3, 3, 5, '09/07/2011'), 
          ('57A' ,1, 4, 187.5, '19/02/2010'), 
          ('57A' ,2, 4, 250, '01/06/2010'), 
          ('57A' ,3, 4, 250, '09/07/2011'), 
          ('A5B' ,1, 1, 12.5, '26/01/2007'), 
          ('A5B' ,2, 1, 25, '06/02/2007'), 
          ('A5B' ,2, 1, 225, '20/08/2009'), 
          ('A5B' ,1, 4, 62.5, '04/07/2006'), 
          ('A5B' ,2, 4, 125, '12/07/2006'), 
          ('A5B' ,2, 4, 250, '01/05/2008'), 
          ('A5B' ,1, 7, 7.5, '11/09/2006'), 
          ('A5B' ,3, 7, 7.5, '26/01/2007'), 
          ('A5B' ,1, 7, 9, '09/04/2010'), 
          ('A5B', 3, 7, 9, '19/07/2010'); 

SELECT t.ID, t.Drug, t.Dose,t.TherapyDate as start_date, 
     (select top 1 t2.TherapyDate    
     from @test t2   
     where t2.ID=t.ID and t2.Drug=t.Drug 
       and ((t2.Dose<>t.Dose and t2.TherapyAction=2) or t2.TherapyAction=3) 
     and t2.TherapyDate > t.TherapyDate 
    order by t2.TherapyDate) as stop_date 
FROM @test t where t.[TherapyAction] in (1,2) 

, но и вы должны проверить это для случая, когда есть несколько периодов приема медикаментов с тем же лекарством для одного пациента

+0

Привет, большое спасибо за ответ. – arm

0

Я думаю, что вы найдете его легче иметь строки с StartDate, EndDate и действий. Если EndDate имеет значение NULL, действие остается «живым».

Вы можете легко написать запрос, чтобы показать действие (или дозу), относящееся к данному дню, или извлечь историю действий для данного предмета.

(Это зависит от вас возможности изменять схему вашей БД)

+0

Имеет ли этот набор данных данные для нескольких пациентов или одного пациента? Является ли первый столбец (57A, ASB и т. Д.) Пациентом, так что запрос должен будет определять начало/остановку на пациентах? – Tim

+0

Да 57A, A5B представляют двух человек ... Я могу извлечь дату начала и Enddate, но выдать Actiontype 2 ,,, поэтому мы можем сказать, что Changedate - это дата начала и окончания дозы cussrent. – arm

+0

Привет, Тим, я пробовал это, но не получил то, что требуется .... любая помощь была бы очень полезна .......................... ................ SELECT ID, \t \t мин (случай, когда [TherapyAction] = 1 или [TherapyAction] = 2, затем [TherapyDate] еще нулевой конец) в качестве StartD, \t \t макс (случай, когда [TherapyAction] = 3 или [TherapyAction] = 2, то [TherapyDate] еще нулевой конец), как EndD, \t \t [лекарствами], \t \t [доза] ОТ [DBO]. [ТЕСТ] группа по ID, [наркотик], доза – arm

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