I have a table in BigQuery with the following fields (and many others but not relevent):
IDTimestamp
For example:
| ID | Timestamp |
|---|---|
| 1 | 2021-04-26 14:57:24.292 UTC |
| 4 | 2019-09-23 19:07:45.002 UTC |
| 1 | 2020-05-12 04:34:27.475 UTC |
| 5 | 2021-03-19 14:57:24.292 UTC |
| 4 | 2020-12-21 16:53:24.292 UTC |
| 1 | 2019-02-24 13:27:56.924 UTC |
I want to get the Start_Date and the End_Date of each row and grouped by ID when the Start_Date is the Date of the Timestamp and the End_Date is the Date of the Timestamp of the following row when it is grouped by ID and ordered by Timestamp.
For example:
| ID | Start_Date | End_Date |
|---|---|---|
| 1 | 2021-04-26 | NULL |
| 4 | 2019-09-23 | 2020-12-21 |
| 1 | 2020-05-12 | 2021-04-26 |
| 5 | 2021-03-19 | NULL |
| 4 | 2020-12-21 | NULL |
| 1 | 2019-02-24 | 2020-05-12 |
Or in an ordered way:
| ID | Start_Date | End_Date |
|---|---|---|
| 1 | 2019-02-24 | 2020-05-12 |
| 1 | 2020-05-12 | 2021-04-26 |
| 1 | 2021-04-26 | NULL |
| 4 | 2019-09-23 | 2020-12-21 |
| 4 | 2020-12-21 | NULL |
| 5 | 2021-03-19 | NULL |
How can I do this in StandardSQL ?
Advertisement
Answer
Use lead():
select t.*,
date(timestamp) as start_date,
date(lead(timestamp) over (partition by id order by timestamp)) as end_date
from t;