获得组中的第n行 - SAS / SQL

时间:2018-05-14 11:55:48

标签: sql sas

任何提示如何从组中获取 n -th元素。首选SAS 4GL,SQL会这样做。

从下面的交易列表中,我想提取每个客户对应于第二个(按日期)交易的行。

输入:

input table

输出:

output

上面示例中的客户C只有一个事务,因此输出表中没有与他对应的行。

提前谢谢!

4 个答案:

答案 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)

  1. 如果您正在尝试进行数据库处理,那么@ 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;