<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Select top N from each group in proc sql in New SAS User</title>
    <link>https://communities.sas.com/t5/New-SAS-User/Select-top-N-from-each-group-in-proc-sql/m-p/852218#M37438</link>
    <description>&lt;P&gt;Please carefully define, or provide starting data and result, exactly what you mean by "top account tied to the store".&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 05 Jan 2023 02:10:43 GMT</pubDate>
    <dc:creator>ballardw</dc:creator>
    <dc:date>2023-01-05T02:10:43Z</dc:date>
    <item>
      <title>Select top N from each group in proc sql</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Select-top-N-from-each-group-in-proc-sql/m-p/852214#M37437</link>
      <description>&lt;P&gt;I'm trying to select the top 1 record belonging to each group in proc sql, but not been able to identify a correct way to do it in proc sql.&amp;nbsp;I'm trying to find top account tied to the store with transactions and total_sales ordered in descending manner. In simple words, one account may be tied to multiple stores, so within each account, I'm trying to filter the top record with highest transactions and sales.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have an excel file which I'm importing using proc import, but providing a sample table below as an example.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;account&lt;/TD&gt;&lt;TD&gt;store_num&lt;/TD&gt;&lt;TD&gt;transactions&lt;/TD&gt;&lt;TD&gt;sales&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;1000&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;90&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;1000&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;170&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;105&lt;/TD&gt;&lt;TD&gt;1015&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;156&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;1234&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;200&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;1234&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;189&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;1234&lt;/TD&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;267&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;105&lt;/TD&gt;&lt;TD&gt;1030&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;170&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I'm initially grouping the account and store_num by sum of transactions and sales in descending order and then used PROC RANK to assign rank.&lt;/P&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class=""&gt;Below is the code that I have tried so far.&lt;/DIV&gt;&lt;P&gt;```&lt;/P&gt;&lt;P&gt;proc import datafile="/myfolder/eg.xlsx"&lt;BR /&gt;out=fileg dbms=xlsx replace;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;proc sql;&lt;BR /&gt;create table tempp as&lt;BR /&gt;Select account, store_num, sum(transactions) as total_Transactions,&amp;nbsp;sum(sales) as Total_Sales,&amp;nbsp;&lt;BR /&gt;from fileg&lt;BR /&gt;group by account, store_num&lt;BR /&gt;order by total_transactions desc, Total_Sales desc;&lt;BR /&gt;quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt;create table main2 as&lt;BR /&gt;select * from tempp&lt;BR /&gt;order by account;&lt;BR /&gt;quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;proc rank data=main2 out=result ties=dense descending;&lt;BR /&gt;by account;&lt;BR /&gt;var total_transactions;&lt;BR /&gt;ranks transRank;&lt;BR /&gt;run;&lt;BR /&gt;proc print data=result n;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;```&lt;/P&gt;&lt;P&gt;The output of 'result' looks like the one below:&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;account&lt;/TD&gt;&lt;TD&gt;store_num&lt;/TD&gt;&lt;TD&gt;total_transactions&lt;/TD&gt;&lt;TD&gt;total_sales&lt;/TD&gt;&lt;TD&gt;transRank&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;1234&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;189&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;1000&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;260&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;1234&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;467&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;105&lt;/TD&gt;&lt;TD&gt;1015&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;156&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;105&lt;/TD&gt;&lt;TD&gt;1030&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;170&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I want my final table to look like the one below so that it ranks and filter outs the first record for each account having highest transactions. In case of a tie in the rank due to same transactions, the highest sales will be used to provide the rank.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;account&lt;/TD&gt;&lt;TD&gt;store_num&lt;/TD&gt;&lt;TD&gt;total_sales&lt;/TD&gt;&lt;TD&gt;total_transactions&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;102&lt;/TD&gt;&lt;TD&gt;1234&lt;/TD&gt;&lt;TD&gt;467&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;101&lt;/TD&gt;&lt;TD&gt;1000&lt;/TD&gt;&lt;TD&gt;260&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;105&lt;/TD&gt;&lt;TD&gt;1030&lt;/TD&gt;&lt;TD&gt;170&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;LI-MESSAGE title="PROC SQL" uid="787516" url="https://communities.sas.com/t5/New-SAS-User/PROC-SQL/m-p/787516#U787516" discussion_style_icon_css="lia-mention-container-editor-message lia-img-icon-forum-thread lia-fa-icon lia-fa-forum lia-fa-thread lia-fa"&gt;&lt;/LI-MESSAGE&gt;&amp;nbsp;&lt;LI-MESSAGE title="GROUP BY" uid="803182" url="https://communities.sas.com/t5/SAS-Procedures/GROUP-BY/m-p/803182#U803182" discussion_style_icon_css="lia-mention-container-editor-message lia-img-icon-forum-thread lia-fa-icon lia-fa-forum lia-fa-thread lia-fa"&gt;&lt;/LI-MESSAGE&gt;&amp;nbsp;&lt;LI-MESSAGE title="Having in proc sql" uid="831205" url="https://communities.sas.com/t5/SAS-Programming/Having-in-proc-sql/m-p/831205#U831205" discussion_style_icon_css="lia-mention-container-editor-message lia-img-icon-forum-thread lia-fa-icon lia-fa-forum lia-fa-thread lia-fa"&gt;&lt;/LI-MESSAGE&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 05 Jan 2023 06:41:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Select-top-N-from-each-group-in-proc-sql/m-p/852214#M37437</guid>
      <dc:creator>hk24</dc:creator>
      <dc:date>2023-01-05T06:41:27Z</dc:date>
    </item>
    <item>
      <title>Re: Select top N from each group in proc sql</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Select-top-N-from-each-group-in-proc-sql/m-p/852218#M37438</link>
      <description>&lt;P&gt;Please carefully define, or provide starting data and result, exactly what you mean by "top account tied to the store".&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 05 Jan 2023 02:10:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Select-top-N-from-each-group-in-proc-sql/m-p/852218#M37438</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2023-01-05T02:10:43Z</dc:date>
    </item>
    <item>
      <title>Re: Select top N from each group in proc sql</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Select-top-N-from-each-group-in-proc-sql/m-p/852236#M37439</link>
      <description>I have edited my question with sample data and code that I have tried so far.</description>
      <pubDate>Thu, 05 Jan 2023 05:31:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Select-top-N-from-each-group-in-proc-sql/m-p/852236#M37439</guid>
      <dc:creator>hk24</dc:creator>
      <dc:date>2023-01-05T05:31:13Z</dc:date>
    </item>
    <item>
      <title>Re: Select top N from each group in proc sql</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Select-top-N-from-each-group-in-proc-sql/m-p/852237#M37440</link>
      <description>&lt;P&gt;SAS SQL doesn't provide window/analytics functions so any selection based on sort order is not that easy to implement.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;With SAS I'd go for a combination of SQL and data step (option 1). It can also be done with a nested SLQ but it's not "pretty" (option 2).&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input account store_num transactions sales;
datalines;
101 1000 3 90
101 1000 6 170
101 1234 7 189
102 1234 9 200
102 1234 11 267
105 1030 5 170
105 1015 5 156
;

/* option 1 */
proc sql;
  create table inter as
  select 
    account,
    store_num,
    sum(sales) as total_sales,
    sum(transactions) as total_transactions
  from have
  group by account, store_num
  order by account, total_transactions, total_sales
  ;
quit;

data want1;
  set inter;
  by account;
  if last.account;
run;

/* option 2 */
proc sql;
  create table want2 as
  select *
  from
  (
    select *
    from 
      (
      select 
        account,
        store_num,
        sum(sales) as total_sales,
        sum(transactions) as total_transactions
      from have
      group by account, store_num
      )
    group by account
    having max(total_transactions)=total_transactions
  )
  group by account
  having max(total_sales)=total_sales
  ;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 05 Jan 2023 06:45:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Select-top-N-from-each-group-in-proc-sql/m-p/852237#M37440</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2023-01-05T06:45:43Z</dc:date>
    </item>
  </channel>
</rss>

