2017-10-18 13 views
0

私はjsonb配列上でcross join lateralを実行していますが、配列要素のrow_number(またはその等価物)を取得しようとしています。 row_numberドキュメントを見ると、「パーティションバイ」に加えて「オーダーバイ」を行う必要があることがわかりますが、実際には使用できるソート基準はありません。アレイにはセットオーダーがあります。配列の残りのデータとともにインデックスを取得します。jsonb_array_elementsまたはjsonb_to_recordsetからrow_numberを取得する

クライアントの表は、この

{ 
    "id": "cj49q33oa000", 
    "email": { 
    "address": "", 
    "after": "2016-06-28T12:28:58.016Z", 
    "error": "Et corporis sed." 
    }, 
    "name": "Arnold Schinner", 
    "birthdate": "2016-07-29T05:09:33.693Z", 
    "status": "paused", 
    "sex": "f", 
    "waist": [ 
    { 
     "completed": "2017-06-23T10:37:37.500Z" 
    }, 
    { 
     "planned": "2017-06-23T10:37:37.500Z" 
    }, 
    { 
     "planned": "2017-06-23T10:37:37.500Z" 
    }, 
    { 
     "planned": "2017-06-23T10:37:37.500Z" 
    } 
    ] 
} 

のようなエントリを持つことになりますし、私は

SELECT client->>'id' AS id, waist.planned 
FROM clients 
CROSS JOIN LATERAL JSONB_TO_RECORDSET(client->'waist') AS waist(planned TIMESTAMP WITH TIME ZONE) 
WHERE waist.planned IS NOT NULL 

のようなクエリを実行すると思いますが、私はいくつかの方法でwaist.position_in_arrayを取得する必要があります。

答えて

1

利用機能jsonb_array_elements(...)with ordinality.

SELECT client->>'id' AS id, (value->>'planned')::timestamptz as planned, ordinality 
FROM clients 
CROSS JOIN LATERAL jsonb_array_elements(client->'waist') with ordinality 
WHERE value->>'planned' IS NOT NULL; 

     id  |   planned   | ordinality 
--------------+--------------------------+------------ 
cj49q33oa000 | 2017-06-23 12:37:37.5+02 |   1 
cj49q33oa000 | 2017-06-23 12:37:37.5+02 |   2 
cj49q33oa000 | 2017-06-23 12:37:37.5+02 |   3 
cj49q33oa000 | 2017-06-23 12:37:37.5+02 |   4 
(4 rows)  
関連する問題