중첩된 JSON 생성
단순한 JSON에서 중첩된 JSON을 생성하려고 합니다.하지만 해결책을 찾을 수 있습니다.
다음은 제가 변환하려는 JSON입니다.
[
{
"station_id": "ESP0001",
"datetime": "2022-11-25T06:43:06.000Z",
"dimension": "temperature",
"value": 15.33,
"representation": "°C",
"unit": "Celsius",
"unit_id": 1
},
{
"station_id": "ESP0001",
"datetime": "2022-11-25T06:43:06.000Z",
"dimension": "humidity",
"value": 92,
"representation": "%",
"unit": "Percentage",
"unit_id": 4
},
{
"station_id": "ESP0001",
"datetime": "2022-11-25T06:43:06.000Z",
"dimension": "pressure",
"value": 1016,
"representation": "hPa",
"unit": "HectoPascal",
"unit_id": 5
}
]
데이터는 이 sql 쿼리(MariaDB 10.8)에 의해 제공됩니다.
SELECT
r.station_id,
r.datetime,
ud.dimension,
r.value,
u.representation,
u.unit,
r.unit_id
FROM readings r
INNER JOIN units u ON (u.id = r.unit_id)
INNER JOIN unit_dimension ud ON (ud.id=u.dimension_id)
WHERE r.station_id = 'ESP0001'
AND r.datetime >= (
SELECT max(datetime)
FROM readings r2
WHERE r2.unit_id = r.unit_id)
ORDER BY r.`datetime` DESC, u.id;
다음은 원하는 JSON 구조입니다.
[
{
"station_id": "ESP0001",
"datetime": "2022-11-25T06:43:06.000Z",
"readings": [
{
"dimension": "temperature",
"value": 15.33,
"representation": "°C",
"unit": "Celsius",
"unit_id": 1
},
{
"dimension": "humidity",
"value": 92,
"representation": "%",
"unit": "Percentage",
"unit_id": 4
},
{
"dimension": "pressure",
"value": 1016,
"representation": "hPa",
"unit": "HectoPascal",
"unit_id": 5
}
]
}
]
다음은 de 데이터베이스 테이블입니다.
- 단위_차원.
- 단위.
- 판독치.
단위_차원 표:
| 이드 | 치수 |
|---|---|
| 1 | 온도 |
| 2 | 습도 |
| 3 | 압력. |
단위 표:
| 이드 | dimension_id | 구성 단위 | 표상 |
|---|---|---|---|
| 1 | 1 | 섭씨 | °C |
| 2 | 1 | 화씨 | 화씨 °F |
| 3 | 1 | 켈빈 | K |
| 4 | 2 | 백분율 | % |
| 5 | 3 | 헥토 파스칼 | hPa |
판독치 표:
| 이드 | station_id | 데이트 시간 | unit_id | 가치 |
|---|---|---|---|---|
| 1 | ESP0001 | 2022-10-31 01:00:00.000 | 1 | 23.5 |
| 2 | ESP0001 | 2022-10-31 01:00:00.000 | 4 | 79 |
| 3 | ESP0001 | 2022-10-31 01:00:00.000 | 5 | 1019.6 |
| 4 | ESP0001 | 2022-10-31 02:00:00.000 | 1 | 23.3 |
| 5 | ESP0001 | 2022-10-31 02:00:00.000 | 4 | 79 |
| 5 | ESP0001 | 2022-10-31 02:00:00.000 | 5 | 1019.6 |
| ... | ... | ... | ... | ... |
백엔드는 Nodejs를 사용합니다.
저는 유효한 솔루션 없이 JSON 기능을 사용하려고 했습니다.
이 쿼리의 경우:
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'station_id', station_id,
'dt', datetime,
ud.dimension, value,
'representation', u.representation,
'unit', u.unit
)
) AS readings
from readings r
inner join units u on (u.id = r.unit_id)
inner join unit_dimension ud on (ud.id = u.dimension_id)
where station_id = 'ESP0001'
group by r.`datetime`
order by r.`datetime` desc, ud.id limit 1;
결과:
[
{"station_id": "ESP0001", "dt": "2022-11-25 07:43:06", "humidity": 92, "representation": "%", "unit": "Percentage"},
{"station_id": "ESP0001", "dt": "2022-11-25 07:43:06", "temperature": 15.33, "representation": "°C", "unit": "Celsius"},
{"station_id": "ESP0001", "dt": "2022-11-25 07:43:06", "pressure": 1016, "representation": "hPa", "unit": "HectoPascal"}
]
제가 생각할 수 있는 유일한 해결책은 두 가지 질문을 하는 것입니다.하나는 마지막 datetime을 얻고 다른 하나는 station_id 및 datetime으로 판독값을 가져와 혼합 객체를 만듭니다.
감사합니다!
업데이트:
@Ajax1234 솔루션 쿼리를 사용하여(몇 가지 변경 사항을 적용했습니다):
select json_arrayagg(
json_object(
"station_id", t.station_id,
"datetime", t.datetime,
"readings", t.js
)
)as "read"
from (
select
r.station_id,
r.datetime,
json_arrayagg(
json_object(
"dimension", ud.dimension,
"value", r.value,
"representation", u.representation,
"unit", u.unit,
"unit_id", r.unit_id
)
) js
from readings r
left join units u on u.id = r.unit_id
left join unit_dimension ud on ud.id = u.dimension_id
WHERE r.station_id = '${req.params.station_id}'
group by r.station_id, r.datetime
order by r.datetime DESC, r.unit_id ASC
LIMIT 20
) t;
결과는 다음과 같습니다.
[
{
"read": [
{
"station_id": "ESP0001",
"datetime": "2022-11-28 02:08:46",
"readings": [
{
"dimension": "temperature",
"value": 12.65,
"representation": "°C",
"unit": "Celsius",
"unit_id": 1
},
{
"dimension": "humidity",
"value": 79,
"representation": "%",
"unit": "Percentage",
"unit_id": 4
},
{
"dimension": "pressure",
"value": 1017,
"representation": "hPa",
"unit": "HectoPascal",
"unit_id": 5
}
]
},
{
"station_id": "ESP0001",
"datetime": "2022-11-28 01:58:46",
"readings": [
{
"dimension": "pressure",
"value": 1017,
"representation": "hPa",
"unit": "HectoPascal",
"unit_id": 5
},
{
"dimension": "humidity",
"value": 78,
"representation": "%",
"unit": "Percentage",
"unit_id": 4
},
{
"dimension": "temperature",
"value": 12.65,
"representation": "°C",
"unit": "Celsius",
"unit_id": 1
}
]
},
{
"station_id": "ESP0001",
"datetime": "2022-11-28 01:48:46",
"readings": [
{
"dimension": "temperature",
"value": 12.74,
"representation": "°C",
"unit": "Celsius",
"unit_id": 1
},
{
"dimension": "humidity",
"value": 77,
"representation": "%",
"unit": "Percentage",
"unit_id": 4
},
{
"dimension": "pressure",
"value": 1017,
"representation": "hPa",
"unit": "HectoPascal",
"unit_id": 5
}
]
},
{
"station_id": "ESP0001",
"datetime": "2022-11-28 01:38:46",
"readings": [
{
"dimension": "pressure",
"value": 1017,
"representation": "hPa",
"unit": "HectoPascal",
"unit_id": 5
},
{
"dimension": "humidity",
"value": 76,
"representation": "%",
"unit": "Percentage",
"unit_id": 4
},
{
"dimension": "temperature",
"value": 12.93,
"representation": "°C",
"unit": "Celsius",
"unit_id": 1
}
]
}
]
}
]
ASC 오더를 할 때도 있고 DESC 오더를 할 때도 있습니다.
먼저 다음을 생성할 수 있습니다."readings"그룹화를 통한 키 집계station_id그리고.datetime그리고 나서 공연을 합니다.json_arrayagg다시 최종 결과를 작성합니다.
select json_arrayagg(json_object("station_id", t.station_id,
"datetime", t.datetime, "readings", t.js))
from (select r.station_id, r.datetime, json_arrayagg(json_object("dimension", ud.dimension,
"value", r.value,
"representation", u.representation,
"unit", u.unit, "unit_id", u.id)) js
from readings r join units u on r.unit_id = u.id
join units_dimension ud on ud.id = u.dimension_id
group by r.station_id, r.datetime
order by r.datetime, r.unit_id) t
바이올린을 보다.
언급URL : https://stackoverflow.com/questions/74578642/generate-a-nested-json
'programing' 카테고리의 다른 글
| 두 셀이 일치하는 경우 세 번째 셀에서 값 반환 (0) | 2023.07.18 |
|---|---|
| 파이썬 모듈은 어디에 저장됩니까? (0) | 2023.07.18 |
| DataFrame의 각 셀에 기능 적용 (0) | 2023.07.18 |
| SQL Server 20008R2에서 ISDRICT FROM과 ISDRICT FROM을 다시 작성하는 방법은 무엇입니까? (0) | 2023.07.18 |
| 벡터에서 여러 값을 삭제하는 방법은 무엇입니까? (0) | 2023.07.18 |