# Difference between revisions of "Window LAG"

## COVID-19 Data

Notes on the data: This data was assembled based on work done by Rodrigo Pombo based on John Hopkins University, based on World Health Organisation. The data was assembled 21st April 2020 - there are no plans to keep this data set up to date.

## Introducing the `covid` table

The example uses a WHERE clause to show the cases in 'Italy' in March.

Modify the query to show data from Spain

```SELECT name, DAY(whn),
confirmed, deaths, recovered
FROM covid
WHERE name = 'Italy'
AND MONTH(whn) = 3
ORDER BY whn
```
```SELECT name, DAY(whn),
confirmed, deaths, recovered
FROM covid
WHERE name = 'Spain'
AND MONTH(whn) = 3
ORDER BY whn
```

## Introducing the LAG function

The LAG function is used to show data from the preceding row or the table. When lining up rows the data is partitioned by country name and ordered by the data whn. That means that only data from Italy is considered.

Modify the query to show confirmed for the day before.

```SELECT name, DAY(whn), confirmed,
LAG(whn, 1) OVER (PARTITION BY name ORDER BY whn)
FROM covid
WHERE name = 'Italy'
AND MONTH(whn) = 3
ORDER BY whn
```
```SELECT name, DAY(whn), confirmed,
LAG(confirmed, 1) OVER (partition by name ORDER BY whn) AS dbf
FROM covid
WHERE name = 'Italy'
AND MONTH(whn) = 3
ORDER BY whn
```

## LAG operation

Here is the correct query showing the cases for the day before:

```SELECT name, DAY(whn), confirmed,
LAG(confirmed, 1) OVER (partition by name ORDER BY whn) AS lag
FROM covid
WHERE name = 'Italy'
AND MONTH(whn) = 3
ORDER BY whn
```

Notice how the values in the LAG column match the value of the row diagonally above and to the left.

nameDAY(whn)confirmeddbf
Italy11694null
Italy220361694
Italy325022036
Italy430892502
Italy538583089
Italy646363858
Italy758834636
Italy873755883
Italy991727375
Italy10101499172
...

## Number of new cases

The number of confirmed case is cumulative - but we can use LAG to recover the number of new cases reported for each day.

Show the number of new cases for each day, for Italy, for March.

```SELECT name, DAY(whn), confirmed,
LAG(confirmed, 1) OVER (PARTITION BY name ORDER BY whn)
FROM covid
WHERE name = 'Italy'
AND MONTH(whn) = 3
ORDER BY whn
```
```SELECT name, DAY(whn), confirmed -
LAG(confirmed, 1) OVER (PARTITION BY name ORDER BY whn) as new
FROM covid
WHERE name = 'Italy'
AND MONTH(whn) = 3
ORDER BY whn
```

## Weekly changes

The data gathered are necessarily estimates and are inaccurate. However by taking a longer time span we can mitigate some of the effects.

Show the number of new cases in the preceding week for Italy for March. (You should show null for the first week).

```SELECT name, DAY(whn), confirmed,
LAG(confirmed, 1) OVER (PARTITION BY name ORDER BY whn)
FROM covid
WHERE name = 'Italy'
AND MONTH(whn) = 3
ORDER BY whn
```
```SELECT name,DAY(whn),
confirmed-LAG(confirmed,7) OVER (ORDER BY whn) "new this week"
FROM covid
WHERE name='Italy' and MONTH(whn)=3
```