我试图根据所有相同的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进行了排序!
有人可以帮帮我吗?
答案 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();