jsonb_to_recordset按某个字段排序,并按另一个字段去重
时间: 2023-12-14 18:38:08 浏览: 34
可以使用`jsonb_to_recordset`函数的`WITH ORDINALITY`选项来对结果进行排序,然后再使用`DISTINCT ON`来按照另一个字段去重。
假设你有一个名为`data`的jsonb字段,其中包含以下数据:
```json
[
{ "name": "John", "age": 25 },
{ "name": "Jane", "age": 30 },
{ "name": "Bob", "age": 25 },
{ "name": "Mary", "age": 35 }
]
```
现在你想按照年龄从小到大排序,并按照姓名去重,可以使用以下查询:
```sql
SELECT DISTINCT ON (name)
name, age
FROM jsonb_to_recordset(data) WITH ORDINALITY AS r(name text, age int, ord int)
ORDER BY age, ord;
```
这将返回以下结果:
```
name | age
------+-----
John | 25
Jane | 30
Mary | 35
```
解释一下上面的查询语句:
首先,`jsonb_to_recordset(data)`将`data`字段中的jsonb数组转换为一个表。
使用`WITH ORDINALITY`选项,我们可以获得每个元素的位置,即`ord`字段。
然后,我们按照年龄和`ord`字段对结果进行排序。
最后,我们使用`DISTINCT ON (name)`来按照姓名去重,只保留每个姓名的第一个结果。注意,这里必须使用`DISTINCT ON`而不是`DISTINCT`,因为我们要按照某个字段去重。