sas

时间:2016-06-29 18:59:50

标签: database sas data-management

我试图根据所有相同的client_id分组的基线日期(在我的数据集中称为baseline_doc)标记第一次和最后一次观察。

例如,我希望我的最终数据集看起来像这样:

Client_id    Baseline_Date       First.baseline_doc    Last.baseline_doc 
---------    ------------------  ------------------    -----------------
1            April 1 2016        0                     0
1            April 20 2016       0                     1
1            January 1 2016      1                     0
2            January 1 2016      1                     0
2            January 20 2016     0                     1
3            February 20 2016    1                     1

注意client_id first和last的类似分组中的第一个和第二个实例的标记是如何在client_id的第一个实例和该client_id的最后一个实例中标记的,然后在每个client_id分组中标记第一个和最后一个观察结果 - 第一个日期标记为1 first.baseline_doc和最后一个日期(或最近的日期)被标记为last.baseline_doc 这是我正在使用的代码:

data FA_CA_DADOS_CLEAN_DELETED;
    set fa_ca_dados_clean2;
    by client_id baseline_doc;
    firstclient_id = first.client_id;
    lastclient_id = last.client_id;
    firstBaseline_doc = first.baseline_doc;
    lastBaseline_doc = last.baseline_doc;
run;

然而,我的代码并没有像我想的那样给我输出。发生的事情是每个client_id都被标记为1为last.baseline_doc,但肯定有一些应该是0 b / c我有重复的client_ids具有不同的日期。

我做错了什么?

我直接从此资源复制了此代码: https://onlinecourses.science.psu.edu/stat481/node/9

它有我想要的输出所以我不确定发生了什么。

在我运行上面的代码之前,我按照client_id和baseline_doc进行了排序!

有人可以帮帮我吗?

4 个答案:

答案 0 :(得分:1)

读取数据后
data myData;
    input @01 Client_id 1. 
        @03 Baseline_Doc date9. ;
    format Baseline_Doc yymmdd10.;
    datalines;
1  1Apr2016 0 0
1 20Apr2016 0 1
1  1Jan2016 1 0
2  1Jan2016 1 0
2 20Jan2016 0 1
3 20Feb2016 1 1
;
run;

这将完成这项工作:

proc sql;
    select all.*
         , case baseline_Doc when baseline_min then 1 else 0 end as baseline_start
         , case baseline_Doc when baseline_max then 1 else 0 end as baseline_stop
    from myData all inner join 
    (   select Client_id
             , min(baseline_doc) as baseline_min
             , max(baseline_doc) as baseline_max
        from myData
        group by Client_id ) as min_max on all.Client_id = min_max.Client_id;
quit;

然而,它可能会带来令人不快的意外,因为根据SQL的规范,它不必保留顺序。

答案 1 :(得分:0)

如果我理解正确,您希望标记每个client_id中的最早和最晚日期。为此,您需要查找first.client_id和last.client_id,而不是first.baseline_doc和last.baseline_doc。可以认为first.x / last.x等同于'这是第一行/最后一行,当前值为x'。

请改为尝试:

data myData;
    input @01 Client_id 1. 
        @03 Baseline_Doc date9. ;
    format Baseline_Doc yymmdd10.;
    datalines;
1  1Apr2016 0 0
1 20Apr2016 0 1
1  1Jan2016 1 0
2  1Jan2016 1 0
2 20Jan2016 0 1
3 20Feb2016 1 1
;
run;

proc sort data = mydata;
  by client_id baseline_doc;
run;

data want;
  set mydata;
  by client_id;
  first_baseline_doc = first.client_id;
  last_baseline_doc  = last.client_id;
run;

答案 2 :(得分:0)

如果您想100%确定订单已保留,您可以执行此操作

按基线日期的升序对输入进行排序,但请记住原始观察数;

data myInput;
   input @01 Client_id 1. 
         @03 Baseline_Doc date9. ;
   format Baseline_Doc yymmdd10.;
   obsNr = _N_;
   datalines;
1  1Apr2016 0 0
1 20Apr2016 0 1
1  1Jan2016 1 0
2  1Jan2016 1 0
2 20Jan2016 0 1
3 20Feb2016 1 1
;
run;
proc sort data = myInput out=myTemp;
  by client_id baseline_doc;
run;

标记第一个和最后一个基准日期;

data myTemp;
  set myTemp;
  by client_id baseline_doc;
  baseline_start = first.client_id;
  baseline_end = last.client_id;
run;

恢复原始订单并忘记密码;

proc sort data = myTemp out=myResult(drop=obsNr);
  by obsNr;
run;

答案 3 :(得分:-1)

$pdf = new PDF_Label('L7163');

$pdf->AddPage();

$query = "SELECT product, color FROM invoice_items WHERE tid = '$getID' ORDER BY id ASC";

$result = $conn->query($query);     


if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $product = $row["product"];
        $color = $row["color"];
        $text = sprintf("%s\n%s\n%s", "$getID", "$product", "$color");
        $pdf->Add_Label($text);
    }
} else {
    echo "0 results";
}
$conn->close();