## Syntax ```mermaid %%{init: { 'theme': 'base', 'flowchart': { 'padding': '7', 'nodeSpacing': '20', 'rankSpacing': '20' }, 'themeVariables': { 'fontSize': '11px', 'fontFamily': 'Arial' } }}%% flowchart TD firstAggregateFunction_start((START)) firstAggregateFunction_start --> firstAggregateFunction_0_0[FIRST]:::quoted firstAggregateFunction_0_0 --> firstAggregateFunction_0_1["("]:::quoted firstAggregateFunction_0_1 --> firstAggregateFunction_0_2[<a href="Invantive UniversalSQL/Grammar/Expression" class="internal-link">expression</a>] firstAggregateFunction_0_2 --> firstAggregateFunction_0_3[")"]:::quoted firstAggregateFunction_0_3 --> firstAggregateFunction_end((END)) ``` ## Purpose Group function to the first non-`null` value in an ordered result set. The order of the rows is determined by the source; combine with an `order by` in a nested query for a deterministic outcome. ## Examples The following example retrieves the first contact person from a contact list, in the order in which the contacts are stored: ```sql select first(cnt.contact_name) from csvtable ( passing 'Acme Industries#Alice Johnson#CFO|Acme Industries#Tom Peters#Accounts Payable|Bergmann GmbH#Erika Weber#Controller|Carlson Ltd#James Smith#CFO|Dubois SA#Marie Dupont#Accounts Payable' row delimiter '|' column delimiter '#' columns customer_name varchar2 position next , contact_name varchar2 position next , role varchar2 position next ) cnt ------------------- Alice Johnson ``` The following example retrieves per customer the alphabetically first contact person, for instance as the default addressee for a dunning letter: ```sql select srt.customer_name , first(srt.contact_name) from ( select cnt.customer_name , cnt.contact_name from csvtable ( passing 'Acme Industries#Alice Johnson#CFO|Acme Industries#Tom Peters#Accounts Payable|Bergmann GmbH#Erika Weber#Controller|Carlson Ltd#James Smith#CFO|Dubois SA#Marie Dupont#Accounts Payable' row delimiter '|' column delimiter '#' columns customer_name varchar2 position next , contact_name varchar2 position next , role varchar2 position next ) cnt order by cnt.customer_name , cnt.contact_name ) srt group by srt.customer_name order by srt.customer_name ------------------- Acme Industries Alice Johnson Bergmann GmbH Erika Weber Carlson Ltd James Smith Dubois SA Marie Dupont ```