任何提示如何从组中获取 n -th元素。首选SAS 4GL,SQL会这样做。
从下面的交易列表中,我想提取每个客户对应于第二个(按日期)交易的行。
输入:
输出:
上面示例中的客户C只有一个事务,因此输出表中没有与他对应的行。
提前谢谢!
答案 0 :(得分:4)
有几种方法可以使用SAS实现这一目标。最简单的方法是对数据集进行排序,然后使用数据步骤输出所需的记录。
proc sort data=have;
by Customer TransactionDate;
run;
data want(drop=counter);
set have;
by Customer TransactionDate;
retain counter;
if first.Customer then counter=1;
else counter+1;
if counter=2 then output;
run;
答案 1 :(得分:1)
实现所需结果集的方法是应用窗口函数。请检查下面的查询。
SELECT
c.TransactionDate
, c.Customer
, c.Product
, c.Quantity
, c.[Purchase Value]
FROM (
SELECT
TransactionDate
, Customer
, Product
, Quantity
, [Purchase Value]
, RANK() OVER (PARTITION BY Customer ORDER BY TransactionDate) AS Ranking
FROM transactions
) AS c
WHERE c.Ranking = 2;
我希望这对你有所帮助!
修改强>
此查询适用于您正在使用支持Windows函数的引擎我在上面的查询中使用的方法(在本例中为SQL Server)。
答案 2 :(得分:1)
此代码将处理当天购买的多件商品的情况。我使用Retain
功能并保留了子组数。
数据:我在A&添加了两个额外项目B在同一天
data have;
infile datalines dlm=',' dsd;
informat Transaction_Date yymmdd10.;
format Transaction_Date yymmdd10.;
input Transaction_Date Customer $ Product $ Quantity Purchase_Value;
datalines;
2018-01-15, A , Milk , 1 , 100
2018-01-28, A , Onion , 2 , 140
2018-01-28, A , corn , 2 , 140
2018-02-13, B , Carrot , 1 , 50
2018-03-20, B , Rice , 10 , 40
2018-03-20, B , tomato , 10 , 40
2018-04-14, B , Carrot , 1 , 50
2018-06-02, C , Candy ,5 , 125
;
run;
代码:计数器是你的第N行
proc sort data=have; by Customer Transaction_Date; run;
data want;
set have;
by Customer Transaction_Date ;
retain outter;
retain inner;
retain counter;
if first.Customer then do; outter=1; counter=0; end; else outter+1;
if first.Transaction_Date then do; inner=1; counter+1; end; else inner+1;
if counter=2 then output;
run;
输出:
Transaction_Date=2018-01-28 Customer=A Product=Onion Quantity=2 Purchase_Value=140 outter=2 inner=1 counter=2
Transaction_Date=2018-01-28 Customer=A Product=corn Quantity=2 Purchase_Value=140 outter=3 inner=2 counter=2
Transaction_Date=2018-03-20 Customer=B Product=Rice Quantity=10 Purchase_Value=40 outter=2 inner=1 counter=2
Transaction_Date=2018-03-20 Customer=B Product=tomato Quantity=10 Purchase_Value=40 outter=3 inner=2 counter=2
答案 3 :(得分:0)
如果您正在尝试进行数据库处理,那么@ alfonsohdez08就是您的选择。 否则@J_Lard是要走的路。 使用proc sql的另一种方法如下所示
proc sql;
create table want(drop = rnk) as
select a.*,
(select count(transaction_date) from have b
where a.customer=b.customer
and a.transaction_date>=b.transaction_date) as rnk
from have a
where calculated rnk = 2;