I would like to calculate the growth for one ticker, while I'm querying multiple tickers. The code I'm trying only works when I run it on a single ticker.
Source Table:
| line | ticker | calendardate | revenueusd | growth |
|---|---|---|---|---|
| 1 | INTC | 2021-09-30 | 19192 | |
| 2 | AMD | 2021-09-30 | 4313 | |
| 3 | AMD | 2021-12-31 | 4826 | ? |
| 4 | INTC | 2021-12-31 | 20528 | ? |
| 5 | INTC | 2022-03-31 | 18353 | ? |
| 6 | AMD | 2022-03-31 | 5887 | ? |
| 7 | INTC | 2022-06-30 | 15321 | ? |
| 8 | AMD | 2022-06-30 | 6550 | ? |
SELECT
ticker,
calendardate,
(revenueusd - LAG (revenueusd) OVER (ORDER BY calendardate ASC)) / LAG (revenueusd) OVER (ORDER BY calendardate ASC) AS growth
FROM
sf1
WHERE
ticker IN ('AMD', 'INTC')
ORDER BY calendardate ASC
Is there anything that I can add to make LAG get the corresponding ticker not just the one "above"? Currently this code at line 4 (INTC) would use the revenue for line 3 (AMD). Insted I would need line 1 (INTC) data.
The data comes from: Nasdaq, Core US Fundamentals Data
CodePudding user response:
you need to PARTITION BY and what you also need to avoid integer division is to9 convert the data into decimal or float
SELECT
ticker,
calendardate,
(revenueusd - LAG (revenueusd) OVER (PARTITION BY ticker ORDER BY calendardate ASC)::DECIMAL(7,2)
/ LAG (revenueusd) OVER (PARTITION BY ticker ORDER BY calendardate ASC))::DECIMAL (7,2) AS growth
FROM
sf1
WHERE
ticker IN ('AMD', 'INTC')
ORDER BY calendardate ASC
| ticker | calendardate | growth |
|---|---|---|
| AMD | 2021-09-30 | null |
| INTC | 2021-09-30 | null |
| INTC | 2021-12-31 | 20527.00 |
| AMD | 2021-12-31 | 4825.00 |
| AMD | 2022-03-31 | 5886.00 |
| INTC | 2022-03-31 | 18352.00 |
| AMD | 2022-06-30 | 6549.00 |
| INTC | 2022-06-30 | 15320.00 |
SELECT 8
