Получение n-го ряда в группе - SAS / SQL - PullRequest
0 голосов
/ 14 мая 2018

любые подсказки, как мне получить n -й элемент из группы.SAS 4GL предпочтительнее, SQL подойдет.

Из приведенного ниже списка транзакций я хотел бы извлечь строку, соответствующую 2-й (по дате) транзакции для каждого клиента.

Вход:

input table

Выход:

output

Клиент C из вышеприведенного примера имеет только одну транзакцию, поэтому в выходной таблице нет соответствующих ему строк.

Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

Этот код будет обрабатывать несколько товаров, купленных в этот день. Я использовал 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
0 голосов
/ 14 мая 2018

Есть несколько способов сделать это с помощью 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;
0 голосов
/ 14 мая 2018
  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;
    
0 голосов
/ 14 мая 2018

Способ достижения желаемого результата - применение оконных функций.Пожалуйста, проверьте запрос ниже.

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)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...