<?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: Multiple Rule for by group enumeration for creating keys in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/589951#M168805</link>
    <description>&lt;P&gt;Thank you for the help so far.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;the values in my explanation above 1.1 and 1.1.1.3 and so on is me trying to explain how the data hierarchy work, the numbering is just visual.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;each keyword you see has its own field specification, in total there are 120 possible fields spit across all the groupings. i need to split out the groups and treat them like small tables, but need to create a key to bring them back together in one group. the data above is a 1 transaction where 2 meters were involved.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;so i need help with generating the numeric counters for each "depth" of each level&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;i'm imagining something like this at the end of the master dataset before i create the subsets for each group.&lt;BR /&gt;&lt;BR /&gt;i did see the below example work by &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/31304"&gt;@PeterClemmensen&lt;/a&gt;this work on 3 fields, but in a there were 3 variables to work with -&amp;nbsp;&lt;A title="enumeration example" href="https://communities.sas.com/t5/SAS-Programming/Enumeration-Varible-3-By-Groups/m-p/547771#M151839" target="_blank" rel="noopener"&gt;https://communities.sas.com/t5/SAS-Programming/Enumeration-Varible-3-By-Groups/m-p/547771#M151839&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
   set have;
   by PID notsorted RID notsorted LID notsorted;
   if first.PID | first.RID | first.LID then do;
      CountVariable+1;
      RestartVariable+1;
   end;
   if first.PID then RestartVariable=1;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;so if i forget the rest of the data for now and just think of the pattern, i'm trying to create counters for each level based on the parent child rules above numbered.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;this is not correct, but i'm trying to illustrate what i'm trying to achieve&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;_n_&lt;/TD&gt;&lt;TD&gt;TRANS_itr&lt;/TD&gt;&lt;TD&gt;TRANS_KEY&lt;/TD&gt;&lt;TD&gt;MTPNT_itr&lt;/TD&gt;&lt;TD&gt;MTPNT_KEY&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;TRANS&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;MTPNT&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ASSET&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;METER&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;READG&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;MTPNT&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ASSET&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;METER&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;READG&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;APPNT&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;TRANS&lt;/TD&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;MTPNT&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ASSET&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;METER&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;READG&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;MTPNT&lt;/TD&gt;&lt;TD&gt;16&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ASSET&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;17&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;METER&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;18&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;READG&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;19&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;APPNT&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 19 Sep 2019 08:13:42 GMT</pubDate>
    <dc:creator>teelov</dc:creator>
    <dc:date>2019-09-19T08:13:42Z</dc:date>
    <item>
      <title>Multiple Rule for by group enumeration for creating keys</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/589775#M168729</link>
      <description>&lt;P&gt;Hello folks. i have some data which needs to be split into 12 or so different groups, there is no key and the order the data is in is important.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;the data has a number of groups and those groups have singular and / or nested groups within that. each group will be split out as the data is (again like some previous posts) in a hierarchical format. so each "GROUP" then has its own format which then all needs to be joined up on one line.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;the difference is to the other issues i've faced is this has many nested groups..&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;the best way i can write out the hierarchy groupings is&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1. Transaction [TRANS]&lt;BR /&gt;&amp;nbsp; &amp;nbsp;1.1. Meter Point [MTPNT]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1.1.1. Asset [ASSET]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1.1.1.1. Meter [METER]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1.1.1.2. Converter [CONVE]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1.1.1.3. Register Details [REGST]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1.1.1.3.1. Reading [READG]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1.1.1.4. Market Participant [MKPRT]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1.1.1.5. Name [NAME]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1.1.1.5.1. Address [ADDRS]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1.1.1.5.2. Contact Mechanism [CONTM]&lt;BR /&gt;&amp;nbsp; &amp;nbsp;1.2. Appointment [APPNT]&lt;BR /&gt;&amp;nbsp; &amp;nbsp;1.3. Name [NAME]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1.3.1. Address [ADDRS]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1.3.2. Contact Mechanism [CONTM]&lt;BR /&gt;&amp;nbsp; &amp;nbsp;1.4. Market Participant [MKPRT]&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;a previous method i have used before was retain and by groups, but that was only for one nested group and i feel i'm getting lost when trying it over so many groups, as once they are split (this is needed for labeling the variables per split) i need a key to join the sub groups back to the parent then, join that back to the main group.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;cavaet: there are 40k extracts with 10k rows each, and not all of the files have all the groups and subgroups each file.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;data sample:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;"TRANS","JOB1000287648","","","EXCHG","","","","COMLT","","D",,"OAMI","501928",,
"MTPNT","",2143024201,"","","","","",1.022640,,
"ASSET","","REMVE","METER","","PP","METLG210","LPG",2014,"L9999999999M","01","","RE"
"METER","","U","ET",6.0000,"","",,"",,
"REGST","","METER",5,"SCMH",1.000
"READG",20160213,,"50384"
"ASSET","","INSTL","METER","","PP","METLG210","LPG",2014,"L23453466756X","01","","LI"
"METER","","U","ET",6.0000,"","",,"",,
"REGST","","METER",5,"SCMH",1.000
"READG",20160213,,"00566"
"APPNT","",20160213,,"","080000",""&lt;/PRE&gt;&lt;P&gt;I'm trying to achieve to get a primary key for each group and sub group and sub sub group for when i join it back to TRANS. I need help in the thought process of how to get these key, my initial thoughts a first. by group processing, but with so many nested groups, i need it to be unique to join back together as the sample above would be 2 rows 2 ASSET subgroups under 1 TRANS parent grouping.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;anyone who has dealt with energy and flow data before would run a mile, hahaha!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks Everyone for reading,&lt;/P&gt;&lt;P&gt;Matt&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;SAS 9.4M2 Grid Server on REHL&lt;/P&gt;</description>
      <pubDate>Wed, 18 Sep 2019 18:43:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/589775#M168729</guid>
      <dc:creator>teelov</dc:creator>
      <dc:date>2019-09-18T18:43:27Z</dc:date>
    </item>
    <item>
      <title>Re: Multiple Rule for by group enumeration for creating keys</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/589803#M168741</link>
      <description>&lt;P&gt;have seen the following post&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;A href="https://communities.sas.com/t5/SAS-Programming/Enumeration-Varible-3-By-Groups/m-p/547771#M151839" target="_blank"&gt;https://communities.sas.com/t5/SAS-Programming/Enumeration-Varible-3-By-Groups/m-p/547771#M151839&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;maybe i need combination of grouping the the "first." declaration&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 18 Sep 2019 19:35:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/589803#M168741</guid>
      <dc:creator>teelov</dc:creator>
      <dc:date>2019-09-18T19:35:00Z</dc:date>
    </item>
    <item>
      <title>Re: Multiple Rule for by group enumeration for creating keys</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/589826#M168752</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/23443"&gt;@teelov&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Hello folks. i have some data which needs to be split into 12 or so different groups, there is no key and the order the data is in is important.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;the data has a number of groups and those groups have singular and / or nested groups within that. each group will be split out as the data is (again like some previous posts) in a hierarchical format. so each "GROUP" then has its own format which then all needs to be joined up on one line.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;the difference is to the other issues i've faced is this has many nested groups..&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;the best way i can write out the hierarchy groupings is&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1. Transaction [TRANS]&lt;BR /&gt;&amp;nbsp; &amp;nbsp;1.1. Meter Point [MTPNT]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1.1.1. Asset [ASSET]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1.1.1.1. Meter [METER]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1.1.1.2. Converter [CONVE]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1.1.1.3. Register Details [REGST]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1.1.1.3.1. Reading [READG]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1.1.1.4. Market Participant [MKPRT]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1.1.1.5. Name [NAME]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1.1.1.5.1. Address [ADDRS]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1.1.1.5.2. Contact Mechanism [CONTM]&lt;BR /&gt;&amp;nbsp; &amp;nbsp;1.2. Appointment [APPNT]&lt;BR /&gt;&amp;nbsp; &amp;nbsp;1.3. Name [NAME]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1.3.1. Address [ADDRS]&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1.3.2. Contact Mechanism [CONTM]&lt;BR /&gt;&amp;nbsp; &amp;nbsp;1.4. Market Participant [MKPRT]&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;a previous method i have used before was retain and by groups, but that was only for one nested group and i feel i'm getting lost when trying it over so many groups, as once they are split (this is needed for labeling the variables per split) i need a key to join the sub groups back to the parent then, join that back to the main group.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;cavaet: there are 40k extracts with 10k rows each, and not all of the files have all the groups and subgroups each file.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;data sample:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;"TRANS","JOB1000287648","","","EXCHG","","","","COMLT","","D",,"OAMI","501928",,
"MTPNT","",2143024201,"","","","","",1.022640,,
"ASSET","","REMVE","METER","","PP","METLG210","LPG",2014,"L9999999999M","01","","RE"
"METER","","U","ET",6.0000,"","",,"",,
"REGST","","METER",5,"SCMH",1.000
"READG",20160213,,"50384"
"ASSET","","INSTL","METER","","PP","METLG210","LPG",2014,"L23453466756X","01","","LI"
"METER","","U","ET",6.0000,"","",,"",,
"REGST","","METER",5,"SCMH",1.000
"READG",20160213,,"00566"
"APPNT","",20160213,,"","080000",""&lt;/PRE&gt;
&lt;P&gt;I'm trying to achieve to get a primary key for each group and sub group and sub sub group for when i join it back to TRANS. I need help in the thought process of how to get these key, my initial thoughts a first. by group processing, but with so many nested groups, i need it to be unique to join back together as the sample above would be 2 rows 2 ASSET subgroups under 1 TRANS parent grouping.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;anyone who has dealt with energy and flow data before would run a mile, hahaha!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks Everyone for reading,&lt;/P&gt;
&lt;P&gt;Matt&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;SAS 9.4M2 Grid Server on REHL&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The first thing you will need to work on is the values ADDRS, NAME, MKPRT&amp;nbsp;and CONTM. The implication from your example data is that is a value in the data but you have the same text value assigned to two different levels of your hierarchy. How, if all that appears in the data, are we to tell which value the encountered ADDRS, NAME, MKPRT&amp;nbsp;or CONTM&amp;nbsp;should have or represent???&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;There are so many possible meanings of "split" that I would really need a very concrete example of what you mean. And possibly a lot of detail describing the rules.&lt;/P&gt;
&lt;P&gt;Much less what it might mean a "for when i join it back to TRANS".&lt;/P&gt;
&lt;P&gt;IF the value you show as the value in the data, such as ADDRS were unique in only appearing with a single meaning then a custom informat that assigned valued would be likely a valid approach and for creating summaries and reports possibly a Multilabel format would be appropriate.&lt;/P&gt;
&lt;P&gt;Something like this is an example:&lt;/P&gt;
&lt;PRE&gt;proc format library=work;
invalue heir  (upcase)
'TRANS' = 10000 
'MTPNT' = 11000 
'ASSET' = 11100 
'METER' = 11110 
'CONVE' = 11120 
'REGST' = 11130 
'READG' = 11131 
'MKPRT' = 11140 
'NAME' = 11150 
'ADDRS' = 11151 
'CONTM' = 11152 
'APPNT' = 12000 
/*'NAME' = 13000 */
/*'ADDRS' = 13100 */
/*'CONTM' = 13200 */
/*'MKPRT' = 14000 */
;
value heir
10000 = 'Transaction' 
11000 = 'Meter Point' 
11100 = 'Asset' 
11110 = 'Meter' 
11120 = 'Converter' 
11130 = 'Register Details' 
11131 = 'Reading' 
11140 = 'Market Participant' 
11150 = 'Name' 
11151 = 'Address' 
11152 = 'Contact Mechanism' 
12000 = 'Appointment' 
/*13000 = 'Name' */
/*13100 = 'Address' */
/*13200 = 'Contact Mechanism' */
/*14000 = 'Market Participant'*/
;

data example;
   infile datalines dlm=',' truncover;
   input value :heir.;
datalines;
TRANS,JOB1000287648,,,EXCHG,,,,COMLT,,D,,OAMI,501928,,
MTPNT,,2143024201,,,,,,1.022640,,
ASSET,,REMVE,METER,,PP,METLG210,LPG,2014,L9999999999M,01,,RE
METER,,U,ET,6.0000,,,,,,
REGST,,METER,5,SCMH,1.000
READG,20160213,,50384
ASSET,,INSTL,METER,,PP,METLG210,LPG,2014,L23453466756X,01,,LI
METER,,U,ET,6.0000,,,,,,
REGST,,METER,5,SCMH,1.000
READG,20160213,,00566
APPNT,,20160213,,,080000,
;


proc print data=example;
  format value heir.;
run;&lt;/PRE&gt;
&lt;P&gt;Note that the repeated values for the hierarchy are commented out because that will not work for an invalue (informat) statement that attempts to assign two different values to the read string.&lt;/P&gt;</description>
      <pubDate>Wed, 18 Sep 2019 20:51:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/589826#M168752</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2019-09-18T20:51:10Z</dc:date>
    </item>
    <item>
      <title>Re: Multiple Rule for by group enumeration for creating keys</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/589951#M168805</link>
      <description>&lt;P&gt;Thank you for the help so far.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;the values in my explanation above 1.1 and 1.1.1.3 and so on is me trying to explain how the data hierarchy work, the numbering is just visual.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;each keyword you see has its own field specification, in total there are 120 possible fields spit across all the groupings. i need to split out the groups and treat them like small tables, but need to create a key to bring them back together in one group. the data above is a 1 transaction where 2 meters were involved.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;so i need help with generating the numeric counters for each "depth" of each level&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;i'm imagining something like this at the end of the master dataset before i create the subsets for each group.&lt;BR /&gt;&lt;BR /&gt;i did see the below example work by &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/31304"&gt;@PeterClemmensen&lt;/a&gt;this work on 3 fields, but in a there were 3 variables to work with -&amp;nbsp;&lt;A title="enumeration example" href="https://communities.sas.com/t5/SAS-Programming/Enumeration-Varible-3-By-Groups/m-p/547771#M151839" target="_blank" rel="noopener"&gt;https://communities.sas.com/t5/SAS-Programming/Enumeration-Varible-3-By-Groups/m-p/547771#M151839&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
   set have;
   by PID notsorted RID notsorted LID notsorted;
   if first.PID | first.RID | first.LID then do;
      CountVariable+1;
      RestartVariable+1;
   end;
   if first.PID then RestartVariable=1;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;so if i forget the rest of the data for now and just think of the pattern, i'm trying to create counters for each level based on the parent child rules above numbered.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;this is not correct, but i'm trying to illustrate what i'm trying to achieve&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;_n_&lt;/TD&gt;&lt;TD&gt;TRANS_itr&lt;/TD&gt;&lt;TD&gt;TRANS_KEY&lt;/TD&gt;&lt;TD&gt;MTPNT_itr&lt;/TD&gt;&lt;TD&gt;MTPNT_KEY&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;TRANS&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;MTPNT&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ASSET&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;METER&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;READG&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;MTPNT&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ASSET&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;METER&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;READG&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;APPNT&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;TRANS&lt;/TD&gt;&lt;TD&gt;11&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;MTPNT&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ASSET&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;13&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;METER&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;14&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;READG&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;MTPNT&lt;/TD&gt;&lt;TD&gt;16&lt;/TD&gt;&lt;TD&gt;6&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ASSET&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;17&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;METER&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;18&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;READG&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;19&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;APPNT&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TD&gt;&lt;TD&gt;20&lt;/TD&gt;&lt;TD&gt;10&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 19 Sep 2019 08:13:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/589951#M168805</guid>
      <dc:creator>teelov</dc:creator>
      <dc:date>2019-09-19T08:13:42Z</dc:date>
    </item>
    <item>
      <title>Re: Multiple Rule for by group enumeration for creating keys</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/590631#M169080</link>
      <description>&lt;P&gt;looks like i'm going to have to create two counters for each&amp;nbsp; group i think&lt;/P&gt;</description>
      <pubDate>Sat, 21 Sep 2019 17:40:44 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/590631#M169080</guid>
      <dc:creator>teelov</dc:creator>
      <dc:date>2019-09-21T17:40:44Z</dc:date>
    </item>
    <item>
      <title>Re: Multiple Rule for by group enumeration for creating keys</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/590888#M169183</link>
      <description>&lt;P&gt;this was my attempt, very basic to start with to see if it is possible in thoery, but none of the keys match up to the groupings&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data TRANS;
	set mpancreate_a;
	by DataItmGrp NOTSORTED;

	if first.DataItmGrp then 
		do;
			if DataItmGrp = "TRANS" then 
				TRANSKey+1;
		end;
run;

data TRANS;
	set TRANS;
	TRANSKey2 + 1;
	by DataItmGrp NOTSORTED;

	if first.DataItmGrp then
		do;
			if DataItmGrp = "TRANS" then
				TRANSKEY2=1;
		end;

	
run;

data MTPNT;
	set TRANS;
	by DataItmGrp NOTSORTED;

	if first.DataItmGrp then
		do;
			if DataItmGrp = "MTPNT" then
				MTPNTKEY+1;
		end;
run;

data MTPNT;
	set MTPNT;
	by  MTPNTKEY NOTSORTED;

	if first.MTPNTKEY  and DataItmGrp = "MTPNT" then
		MTPNTKEY2=0;
	MTPNTKEY2+1;
run;

data ASSET;
	set MTPNT;

	IF MTPNTKEY = 0 THEN
		MTPNTKEY2=0;
	by DataItmGrp NOTSORTED;

	if first.DataItmGrp then
		do;
			if DataItmGrp = "ASSET" then
				ASSETKEY+1;
		end;
run;

data ASSET;
	set ASSET;
	by  ASSETKEY NOTSORTED;

	if first.ASSETKEY  and DataItmGrp = "ASSET" then
		ASSETKEY2=0;
	ASSETKEY2+1;

	IF ASSETKEY =0 THEN
		ASSETKEY2=0;
run;

data METER;
	set ASSET;

	IF ASSETKEY = 0 THEN
		ASSETKEY2=0;
	by DataItmGrp NOTSORTED;

	if first.DataItmGrp then
		do;
			if DataItmGrp = "METER" then
				METERKEY+1;
		end;
run;

data METER;
	set METER;
	by  ASSETKEY NOTSORTED;

	if first.ASSETKEY  and DataItmGrp = "METER" then
		METERKEY2=0;
	METERKEY2+1;

	IF METERKEY =0 THEN
		METERKEY2=0;
run;

data CONVE;
	set METER;

	IF METERKEY = 0 THEN
		METERKEY2=0;
	by DataItmGrp NOTSORTED;

	if first.DataItmGrp then
		do;
			if DataItmGrp = "CONVE" then
				CONVEKEY+1;
		end;
run;

data METER;
	set METER;
	by  ASSETKEY NOTSORTED;

	if first.ASSETKEY  and DataItmGrp = "CONVE" then
		CONVEKEY2=0;
	CONVEKEY2+1;

	IF CONVEKEY =0 THEN
		CONVEKEY2=0;
run;


data REGST;
	set METER;

IF METERKEY = 0 THEN
		METERKEY2=0;
	by DataItmGrp NOTSORTED;

	if first.DataItmGrp then
		do;
			if DataItmGrp = "REGST" then
				REGSTGKEY+1;
		end;
run;


data PRE_SPLIT;
	set REGST;
	by  REGSTGKEY NOTSORTED;

	if first.REGSTGKEY  and DataItmGrp = "REGST" then
		REGSTGKEY2=0;
	REGSTGKEY2+1;

	IF REGSTGKEY =0 THEN
		REGSTGKEY2=0;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 23 Sep 2019 12:38:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Multiple-Rule-for-by-group-enumeration-for-creating-keys/m-p/590888#M169183</guid>
      <dc:creator>teelov</dc:creator>
      <dc:date>2019-09-23T12:38:15Z</dc:date>
    </item>
  </channel>
</rss>

