LAG

Returns a value from a previous row within the partition of a result set.

See also: LEAD.

Syntax

LAG ( expr [, offset ])
   OVER (
         [ PARTITION BY partition_expr [, ...] ]
         [ ORDER BY order [ ASC | DESC ] [, ...]]
      )

offset ::= integer

Arguments

Parameter

Description

expr

Any value expression

offset

Specifies the offset of rows to scan back. If not specified, defaults to 1.

Returns

Same type as expr.

Notes

  • offset is evaluated with respect to the current row. If not specified, offset defaults to 1.

  • If there is no previous row (calculated against the current row), LAG returns NULL.

Examples

For these examples, assume a table named nba, with the following structure:

CREATE TABLE nba
(
   "Name" varchar(40),
   "Team" varchar(40),
   "Number" tinyint,
   "Position" varchar(2),
   "Age" tinyint,
   "Height" varchar(4),
   "Weight" real,
   "College" varchar(40),
   "Salary" float
 );

Here’s a peek at the table contents (Download nba.csv):

nba.csv

Name

Team

Number

Position

Age

Height

Weight

College

Salary

Avery Bradley

Boston Celtics

0.0

PG

25.0

6-2

180.0

Texas

7730337.0

Jae Crowder

Boston Celtics

99.0

SF

25.0

6-6

235.0

Marquette

6796117.0

John Holland

Boston Celtics

30.0

SG

27.0

6-5

205.0

Boston University

R.J. Hunter

Boston Celtics

28.0

SG

22.0

6-5

185.0

Georgia State

1148640.0

Jonas Jerebko

Boston Celtics

8.0

PF

29.0

6-10

231.0

5000000.0

Amir Johnson

Boston Celtics

90.0

PF

29.0

6-9

240.0

12000000.0

Jordan Mickey

Boston Celtics

55.0

PF

21.0

6-8

235.0

LSU

1170960.0

Kelly Olynyk

Boston Celtics

41.0

C

25.0

7-0

238.0

Gonzaga

2165160.0

Terry Rozier

Boston Celtics

12.0

PG

22.0

6-2

190.0

Louisville

1824360.0

Using LAG to access previous rows

Changed in version 2020.2: LAG and LEAD are supported from v2020.2.

This example calculates the salary between two players, starting from the highest salary.

t=> SELECT "Name",
.          "Salary",
.          LAG("Salary") OVER (ORDER BY "Salary" DESC) AS "Salary - previous",
.          LAG("Salary",1) OVER (ORDER BY "Salary" DESC) - "Salary" AS "Salary - diff"
.          -- LAG("Salary",1) is equivalent to LAG("Salary")
.   FROM   nba
.   LIMIT 11 ;
Name            | Salary   | Salary - previous | Salary - diff
----------------+----------+-------------------+--------------
Kobe Bryant     | 25000000 |                   |
LeBron James    | 22970500 |          25000000 |       2029500
Carmelo Anthony | 22875000 |          22970500 |         95500
Dwight Howard   | 22359364 |          22875000 |        515636
Chris Bosh      | 22192730 |          22359364 |        166634
Chris Paul      | 21468695 |          22192730 |        724035
Kevin Durant    | 20158622 |          21468695 |       1310073
Derrick Rose    | 20093064 |          20158622 |         65558
Dwyane Wade     | 20000000 |          20093064 |         93064
Brook Lopez     | 19689000 |          20000000 |        311000
DeAndre Jordan  | 19689000 |          19689000 |             0