2016-07-08 3 views
0

У меня возникла проблема с группировкой, если значение такое же, как в приведенной выше строке.Свернуть данные в Sql без сохраненного приоритета или функции, если значение совпадает с значением из строки выше

Наше заявление выглядит следующим образом:

SELECT pat_id, 
     treatData.treatmentdate AS Date, 
     treatMeth.name   AS TreatDataTableInfo, 
     treatData.treatmentid AS TreatID 
FROM dialysistreatmentdata treatData 
     LEFT JOIN hdtreatmentmethods treatMeth 
       ON treatMeth.id = treatData.hdtreatmentmethodid 
WHERE treatData.hdtreatmentmethodid IS NOT NULL 
     AND Year(treatData.treatmentdate) >= 2013 
     AND ekeyid = 12 
ORDER BY treatData.ekeyid, 
      treatmentdate DESC, 
      treatdatatableinfo; 

Результат выглядит следующим образом:

Original output

Нужный выход должны быть сгруппированы, если значение такое же, как в строке/rows before и ther должны быть ToDate, как вы можете видеть на скриншоте, который является датой следующей строки -1 день. Желательный результат должен выглядеть следующим образом:

Desired output

Я надеюсь, что кто-то имеет решение по этому вопросу!

Возможно, у кого-то есть идея, как решить эту проблему в qlikview.

Ждет решения Michael

+1

Какую версию SQL вы используете? MySQL? Microsoft SQL? Пожалуйста уточни. –

+0

Microsoft SQL: SQLServer2008 –

ответ

1

Вы хотите свернуть эпизоды лечения в отдельные строки. Это проблема «пробелов и островов». Мне нравится разница числа строки подход:

select patid, min(date) as fromdate, max(date) as todate, TreatDataTableInfo, 
     min(treatid) 
from (select td.Pat_ID, td.TreatmentDate As Date, tm.Name As TreatDataTableInfo,  
      td.TreatmentID As TreatID, 
      row_number() over (partition by td.pat_id order by td.treatmentdate) as seqnum_p, 
      row_number() over (partition by td.pat_id, tm.name order by td.treatment_date) as seqnum_pn 
     from DialysisTreatmentData td Left join 
      HDTreatmentMethods tm 
      On tm.ID = td.HDTreatmentMethodID 
     where td.HDTreatmentMethodID Is Not Null And 
      td.TreatmentDate) >= '2013-01-01' and 
      EKeyID = 12 
    ) t 
group by patid, TreatDataTableInfo, (seqnum_p - seqnum_pn) 
order by patid, TreatmentDate Desc, TreatDataTableInfo; 

Примечание: Это использует стандартную оконную функцию ANSI row_number(), который доступен в большинстве баз данных.

+0

Спасибо, миллион, это сработало идеально для нас! Потребовалось некоторое время, чтобы понять часть с row_number() –

0

Ниже приведено возможное решение Qlikview. Я добавил несколько комментариев в скрипт. Если это не ясно, просто дайте мне знать. Результат показан ниже сценария.

RawData: 
Load * Inline [ 
    Pat_ID,Date,TreatDataTableInfo,TreatId 
    PatNum_12,08.07.2016,HDF Pradilution,1 
    PatNum_12,07.07.2016,HDF Predilution,2 
    PatNum_12,23.03.2016,HD,3 
    PatNum_12,24.11.2015,HD,4 
    PatNum_12,22.11.2015,HD,5 
    PatNum_12,04.09.2015,HD,6 
    PatNum_12,01.09.2015,HD,7 
    PatNum_12,30.07.2015,HD,8 
    PatNum_12,12.01.2015,HD,9 
    PatNum_12,09.01.2015,HD,10 
    PatNum_12,26.08.2014,Hemodialysis,11 
    PatNum_12,08.07.2014,Hemodialysis,12 
    PatNum_12,23.05.2014,Hemodialysis,13 
    PatNum_12,19.03.2014,Hemodialysis,14 
    PatNum_12,29.01.2014,Hemodialysis,15 
    PatNum_12,14.12.2013,Hemodialysis,16 
    PatNum_12,26.10.2013,Hemodialysis,17 
    PatNum_12,05.10.2013,Hemodialysis,18 
    PatNum_12,03.10.2013,HD,19 
    PatNum_12,24.06.2013,Hemodialysis,20 
    PatNum_12,03.06.2013,Hemodialysis,21 
    PatNum_12,14.05.2013,Hemodialysis,22 
    PatNum_12,26.02.2013,HDF Postdilution,23 
    PatNum_12,23.02.2013,HDF Pradilution,24 
    PatNum_12,21.02.2013,HDF Postdilution,25 
    PatNum_12,07.02.2013,HD,26 
    PatNum_12,25.01.2013,HDF Pradilution,27 
    PatNum_12,18.01.2013,HDF Pradilution,28 
]; 


GroupedData: 
Load 
    *, 
    // assign new GroupId for all rows where the TreatDataTableInfo is equal 
    if(RowNo() = 1, 1, 
     if(TreatDataTableInfo <> peek('TreatDataTableInfo'), 
      peek('GroupId') + 1, peek('GroupId'))) as GroupId, 
    // assign new GroupSubId (incremental int) for all the records in each group 
    if(TreatDataTableInfo <> peek('TreatDataTableInfo'), 
     1, peek('GroupSubId') + 1) as GroupSubId, 
    // pick the first Date field value and spread it acccross the group 
    if(TreatDataTableInfo <> peek('TreatDataTableInfo'), TreatId, peek('TreatId_Temp')) as TreatId_Temp 
Resident 
    RawData 
; 

Drop Table RawData; 


right join (GroupedData) 

// get the max GroupSubId for each group and right join it to 
// the GroupedData table to remove the records we dont need 
MaxByGroup: 
Load 
    max(GroupSubId) as GroupSubId, 
    GroupId 
Resident 
    GroupedData 
Group By 
    GroupId 
;  

// these are not needed anymore 
Drop Fields GroupId, GroupSubId, TreatId; 

// replace the old TreatId with the new TreatId_Temp field 
// which contains the first TreatId for each group 
Rename Field TreatId_Temp to TreatId; 

enter image description here