I have this table that I need to compare the values from the current hour with the previous hour for each ID.
| id | value | time |
|---|---|---|
| A | 1 | 3pm |
| B | 2 | 3pm |
| C | 3 | 3pm |
| A | 3 | 2pm |
| B | 2 | 2pm |
| C | 1 | 2pm |
| A | 3 | 1pm |
| B | 2 | 1pm |
| C | 2 | 1pm |
If the values from the current hour and the previous hour is different, the 'got_changes' table will have 'yes' value and 'no' if similar. If there's no previous hour data, it will just have 'yes' for 'got_changes'.
| id | value | time | got_changes |
|---|---|---|---|
| A | 1 | 3pm | yes |
| B | 2 | 3pm | no |
| C | 3 | 3pm | yes |
| A | 3 | 2pm | no |
| B | 2 | 2pm | no |
| C | 1 | 2pm | yes |
| A | 3 | 1pm | yes |
| B | 2 | 1pm | yes |
| C | 2 | 1pm | yes |
I couldn't think of a good logic to do this. Any help would be very much appreciated.
CodePudding user response:
Use LAG() window function in a CASE expression to check the previous value of each id:
SELECT *,
CASE WHEN value = LAG(value) OVER (PARTITION BY id ORDER BY time) THEN 'no' ELSE 'yes' END got_changes
FROM tablename
ORDER BY time DESC, id;
See the demo.
