Выбор максимального значения в типе данных JSON - PullRequest
0 голосов
/ 19 мая 2018

Я работаю с ответами Кайроса, и у меня есть тот:

{
   "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 и найти максимальное значение?

1 Ответ

0 голосов
/ 19 мая 2018

Вы ищете максимальное значение на одной фотографии?Затем попробуйте это, используя 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...