У меня есть таблица устройств (dev) и таблица device_date (dev_data). Отношение 1: М
таблица разработчиков:
| id |name |status |
|-----|-------|-------|
| 1 |a |111 |
|-----|-------|-------|
| 2 |b |123 |
|-----|-------|-------|
| ....|..... |.... |
таблица dev_data:
|id |dev_id |status |date |
|---|-------|--------|------------------------|
|1 |1 | 123 |2019-04-16T18:53:07.908Z|
|---|-------|--------|------------------------|
|2 |1 | 120 |2019-04-16T18:54:07.908Z|
|---|-------|--------|------------------------|
|3 |1 | 1207 |2019-04-16T18:55:07.908Z|
|---|-------|--------|------------------------|
|4 |2 | 123 |2019-04-16T18:53:08.908Z|
|---|-------|--------|------------------------|
|5 |2 | 121 |2019-04-16T18:54:08.908Z|
|---|-------|--------|------------------------|
|6 |2 | 127 |2019-04-16T18:55:08.908Z|
|...|.......|........|........................|
Мне нужно выбрать все dev и присоединиться к dev_data, но добавить только 2 последние записи (по дате)
окончательный ответ должен выглядеть следующим образом:
status_calc_1
и status_calc_2
- разница между status
в dev и dev_data
status_calc_1 => status
отличие последней строки от dev_data и dev
status_calc_2 => status
отличие строки prelast от dev_data и dev
|id |name |status_calc_1 | status_calc_2 |
|----|------|---------------|---------------|
|1 |a |1207-111 |120-111 |
|----|------|---------------|---------------|
|2 |b |127-123 |121-123 |
Я попробовал это:
select id, "name", status, max(dd.date) as last,
(select date from device_data p where p.dev_id = device.id and date < dd.date limit 1) as prelast
from device
inner join device_data dd on device.id = dd.dev_id
group by id, "name", status;
но получите ошибку:
ERROR: subquery uses ungrouped column "device.id" from outer query
и этот:
select id, "name", status, max(dd.date) as last, max(dd2.date) as prelast,
from device
inner join device_data dd on device.id = dd.dev_id
inner join device_data dd2 on device.id = dd2.dev_id and dd2.date < dd.date
group by id, "name", status;
Я получаю правильные 2 последние dev_data, но все же, не знаю, как сделать 2 столбца status_calc_1
и status_calc_2
status_calc_1 = последняя строка dev_data.status - dev.status
status_calc_2 = предварительная строка dev_data.status - dev.status