Я работаю с ответами Кайроса, и он у меня есть:
{
"images":[
{
"file":"foo.jpg",
"faces":[
{
"yaw":1,
"roll":1,
"pitch":-8,
"width":113,
"height":113,
"face_id":1,
"quality":0.13918,
"chinTipX":107,
"chinTipY":215,
"topLeftX":52,
"topLeftY":95,
"attributes":{
"age":31,
"lips":"Together",
"asian":0.00125,
"black":0.0001,
"other":0.00571,
"white":0.98087,
"gender":{
"type":"M",
"maleConfidence":0.99999,
"femaleConfidence":0.00001
},
"glasses":"None",
"hispanic":0.01207
},
"confidence":0.99946,
"eyeDistance":48,
"leftEyeCenterX":133,
"leftEyeCenterY":126,
"rightEyeCenterX":85,
"rightEyeCenterY":125
}
],
"width":214,
"height":317,
"status":"Complete"
}
]
}
Я могу выделить небольшую часть этого json с помощью этого запроса:
select facedata.data->'images'->0->'faces'->0->'attributes'
from facedata
where facedata.data->'Errors' isnull;
Но мне нужно всего пять ключей из этой небольшой части; чернить, белый, латиноамериканец, азиатский и Другие, чтобы иметь возможность найти максимальное значение этих ключей.
Как выбрать несколько ключей JSON и найти максимальное значение?





Ищете максимальную ценность в одной фотографии? Затем попробуйте это с помощью json_each().
SELECT each.key::text,
each.value::text::decimal
FROM facedata
CROSS JOIN json_each(facedata.data->'images'->0->'faces'->0->'attributes') each
WHERE facedata.data->'Errors' isnull
AND each.key IN ('black',
'white',
'hispanic',
'asian',
'other')
AND each.value::text::decimal = (SELECT max(eachi.value::text::decimal)
FROM json_each(facedata.data->'images'->0->'faces'->0->'attributes') eachi
WHERE eachi.key IN ('black',
'white',
'hispanic',
'asian',
'other'));
(Примечание: он обнаружит связи, если они есть. Возможно, вам придется настроить его, если вы этого не хотите.)
Или за максимум значений на нескольких фото? Тогда вы можете попробовать это.
SELECT max((facedata.data->'images'->0->'faces'->0->'attributes'->'black')::text::decimal) black,
max((facedata.data->'images'->0->'faces'->0->'attributes'->'white')::text::decimal),
max((facedata.data->'images'->0->'faces'->0->'attributes'->'hispanic')::text::decimal),
max((facedata.data->'images'->0->'faces'->0->'attributes'->'asian')::text::decimal),
max((facedata.data->'images'->0->'faces'->0->'attributes'->'other')::text::decimal)
FROM facedata
WHERE facedata.data->'Errors' isnull;
пожалуйста, добавьте желаемый результат.