First, Last Functions

Description

Return a field value from the first or last record in the result set returned by a query.

Syntax

First(expr)

Last(expr)

The expr placeholder represents a string expression identifying the field that contains the data you want to use or an expression that performs a calculation using the data in that field. Operands in expr can include the name of a table field, a constant, or a function (which can be either intrinsic or user-defined but not one of the other SQL aggregate functions).

Remarks

The First and Last functions are analogous to the MoveFirst and MoveLast methods of a DAO Recordset object. They simply return the value of a specified field in the first or last record, respectively, of the result set returned by a query. Because records are usually returned in no particular order (unless the query includes an ORDER BY clause), the records returned by these functions will be arbitrary.

See Also

MoveFirst, MoveLast, MoveNext, MovePrevious methods ("DAO Language Reference"), Recordset object ("DAO Language Reference"), SELECT statement.

Specifics (Microsoft Access)

In Microsoft Access, you can use the First and Last functions in the query design grid, in an SQL statement in SQL view of the Query window, or in an SQL statement within Visual Basic code. You can also use the First and Last functions in a calculated control on a form or report.

The First and Last functions are most useful in calculated controls on a report. For example, if you have an Order report that is grouped on a ShipCountry field and sorted on an OrderDate field, you can use the First and Last functions in calculated controls to show the range of earliest to latest order dates for each grouping. To group on the ShipCountry field, click the Sorting And Grouping button on the Report Design toolbar. Choose ShipCountry in the Field/Expression column, and set the GroupHeader and GroupFooter properties to Yes. In Design view, create two new text boxes in the ShipCountry footer, and set the ControlSource property for both to the following expressions:

=First([OrderDate])
=Last([OrderDate])
When you switch to Print Preview, you will see the first and last order dates for each group of orders.

Note    If you want to return the first or last record in a set of records in Microsoft Access 97, you should create a query sorted as either ascending or descending and set the TopValues property to 1. For more information, see the TopValues property topic. From Visual Basic, you can also create a sorted result set of the query, and use the DAO MoveFirst or MoveLast method to return the first or last record in a set of records.

Example

This example uses the Employees table to return the values from the LastName field of the first and last records returned from the table.

This example calls the EnumFields procedure, which you can find in the SELECT statement example.

Sub FirstLastX1()

    Dim dbs As Database, rst As Recordset

    ' Modify this line to include the path to Northwind
    ' on your computer.
    Set dbs = OpenDatabase("Northwind.mdb")
    
    ' Return the values from the LastName field of the 
    ' first and last records returned from the table.
    Set rst = dbs.OpenRecordset("SELECT " _
        & "First(LastName) as First, " _
        & "Last(LastName) as Last FROM Employees;")
    
    ' Populate the Recordset.
    rst.MoveLast
    
    ' Call EnumFields to print the contents of the 
    ' Recordset. Pass the Recordset object and desired
    ' field width.
    EnumFields rst, 12

    dbs.Close

End Sub
The next example compares using the First and Last functions with simply using the Min and Max functions to find the earliest and latest birth dates of Employees.

Sub FirstLastX2()

    Dim dbs As Database, rst As Recordset

    ' Modify this line to include the path to Northwind
    ' on your computer.
    Set dbs = OpenDatabase("Northwind.mdb")
    
    ' Find the earliest and latest birth dates of
    ' Employees.
    Set rst = dbs.OpenRecordset("SELECT " _
        & "First(BirthDate) as FirstBD, " _
        & "Last(BirthDate) as LastBD FROM Employees;")
    
    ' Populate the Recordset.
    rst.MoveLast
    
    ' Call EnumFields to print the contents of the 
    ' Recordset. Pass the Recordset object and desired
    ' field width.
    EnumFields rst, 12
    
    Debug.Print

    ' Find the earliest and latest birth dates of
    ' Employees.
    Set rst = dbs.OpenRecordset("SELECT " _
& "Min(BirthDate) as MinBD," _ & "Max(BirthDate) as MaxBD FROM Employees;") ' Populate the Recordset. rst.MoveLast ' Call EnumFields to print the contents of the ' Recordset. Pass the Recordset object and desired ' field width. EnumFields rst, 12 dbs.Close End Sub