簡體   English   中英

使用SAS或SQL查找行中的第一個和最后一個非空值?

[英]Using SAS or SQL find the first and last non-empty value within a row?

我的數據當前為以下形式:

 ID     Fill1          Fill2         Fill3         Fill4          Fill5     
 1      01JAN2014      28JAN2014     26FEB2014     .              .
 2      .              05FEB2012     03MAR2012     02APR2012      01MAY2012
 3      10MAR2015      08APR2015     07MAY2015     05JUN2015      03JUL2015
 4      .              .             20FEB2013     18MAR2013      .         

我正在嘗試為每個ID創建治療“片段”。 換句話說,對於每個ID,我想查找第一個和最后一個非空填充,然后計算兩個日期之間的差。 例如對於ID = 1,我需要找到01JAN2014和26FEB2014之間的時差。 那是,

Fill1-Fill3 =情節持續時間

但是對於ID = 4,我需要找到

Fill3-Fill4 =情節持續時間

其中epipduration是創建的新變量。 我有超過30k的唯一ID,其中“開始”和“最后”填充日期各不相同。 在此先感謝您的幫助。

data have;
input Id Fill1 date9. Fill2 date9. Fill3 date9. Fill4 date9. Fill5 date9.;
format Fill1 -  Fill5 date9.;
cards;
1 01JAN201428JAN201426FEB2014 
2          05FEB201203MAR201202APR201201MAY2012
3 10MAR201508APR201507MAY201505JUN201503JUL2015
4                   20FEB201318MAR2013 
;
run;

data want;
set have;
    array fill {5};
    format first last date9.;

    do i = 1 to dim(fill);
       first=coalesce(first, fill(i));
       last=coalesce(fill(i), last);
    end;

    episodeduration = last - first;

    drop i;
run;

使用array語句創建數組並遍歷變量和coalesce()函數以查找第一個/最后一個非缺失的對象。

注釋:該代碼將通過從第一個到最后一個變量來查找第一個/最后一個。 如果您需要日期的第一位/最后一位,則min和max函數是不錯的選擇: min(of fill1 -- fill5); -無需循環。

vasja的SAS版本看起來很不錯,這是在SQL方面可以做到的方式(幾乎完全相同的過程)。

Select *, 
    DATEDIFF(day, 
         CONVERT(date,COALESCE(date1, date2, date3, date4, date5)),
         CONVERT(date, COALESCE(date5,date4,date3,date2,date1))
    )
from SomeTableNameAboutEpisodes;

基本上,使用合並查找第一個非空值,然后將其轉換為日期。 然后,您可以計算兩個日期之間的差額。 但是,這僅在空單元格沒有值(空)並且沒有空行的情況下有效。 (不過,您可以簡單地放置一個ISNULL(DATEDIF(...),0) )。

您可以使用降序的“ SAS變量列表”(FILL5-FILL1)使其變得更容易。

data diff;
   set have;
   first = coalesce(of fill1-fill5);
   i     = whichn(first,of fill1-fill5);
   last  = coalesce(of fill5-fill1);
   j     = 6-whichn(last, of fill5-fill1);
   format first last date9.;
   run;

Obs    Id        Fill1        Fill2        Fill3        Fill4        Fill5        first    i         last    j

 1      1    01JAN2014    28JAN2014    26FEB2014            .            .    01JAN2014    1    26FEB2014    3
 2      2            .    05FEB2012    03MAR2012    02APR2012    01MAY2012    05FEB2012    2    01MAY2012    5
 3      3    10MAR2015    08APR2015    07MAY2015    05JUN2015    03JUL2015    10MAR2015    1    03JUL2015    5
 4      4            .            .    20FEB2013    18MAR2013            .    20FEB2013    3    18MAR2013    4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM