【发布时间】:2018-06-27 12:31:46
【问题描述】:
以前在这里问过类似的问题:
计算单个键的项目数:jq count the number of items in json by a specific key
计算对象值的总和: How do I sum the values in an array of maps in jq?
问题
如何模拟 COUNT 聚合函数,它的行为应该与其 SQL 原始函数相似?让我们进一步扩展这个问题以包含其他常规 SQL 函数:
- 计数
- SUM / MAX/ MIN / AVG
- ARRAY_AGG
最后一个不是标准 SQL 函数 - 它来自 PostgreSQL,但非常有用。
输入端是一个有效的 JSON 对象流。为了演示,让我们选择一个关于主人和他们的宠物的简单故事。
模型和数据
基础关系:所有者
id name age
1 Adams 25
2 Baker 55
3 Clark 40
4 Davis 31
基础关系:宠物
id name litter owner_id
10 Bella 4 1
20 Lucy 2 1
30 Daisy 3 2
40 Molly 4 3
50 Lola 2 4
60 Sadie 4 4
70 Luna 3 4
来源
从上面我们得到一个派生关系 Owner_Pet(上述关系的 SQL JOIN 的结果)以 JSON 格式呈现给我们的 jq 查询(源数据):
{ "owner_id": 1, "owner": "Adams", "age": 25, "pet_id": 10, "pet": "Bella", "litter": 4 }
{ "owner_id": 1, "owner": "Adams", "age": 25, "pet_id": 20, "pet": "Lucy", "litter": 2 }
{ "owner_id": 2, "owner": "Baker", "age": 55, "pet_id": 30, "pet": "Daisy", "litter": 3 }
{ "owner_id": 3, "owner": "Clark", "age": 40, "pet_id": 40, "pet": "Molly", "litter": 4 }
{ "owner_id": 4, "owner": "Davis", "age": 31, "pet_id": 50, "pet": "Lola", "litter": 2 }
{ "owner_id": 4, "owner": "Davis", "age": 31, "pet_id": 60, "pet": "Sadie", "litter": 4 }
{ "owner_id": 4, "owner": "Davis", "age": 31, "pet_id": 70, "pet": "Luna", "litter": 3 }
请求
以下是示例请求及其预期输出:
- 统计每位主人的宠物数量:
{ "owner_id": 1, "owner": "Adams", "age": 25, "pets_count": 2 }
{ "owner_id": 2, "owner": "Baker", "age": 55, "pets_count": 1 }
{ "owner_id": 3, "owner": "Clark", "age": 40, "pets_count": 1 }
{ "owner_id": 4, "owner": "Davis", "age": 31, "pets_count": 3 }
- 总结每个所有者的幼崽数量并得到他们的 MAX(MIN/AVG):
{ "owner_id": 1, "owner": "Adams", "age": 25, "litter_total": 6, "litter_max": 4 }
{ "owner_id": 2, "owner": "Baker", "age": 55, "litter_total": 3, "litter_max": 3 }
{ "owner_id": 3, "owner": "Clark", "age": 40, "litter_total": 4, "litter_max": 4 }
{ "owner_id": 4, "owner": "Davis", "age": 31, "litter_total": 9, "litter_max": 4 }
- ARRAY_AGG 宠物每位主人:
{ "owner_id": 1, "owner": "Adams", "age": 25, "pets": [ "Bella", "Lucy" ] }
{ "owner_id": 2, "owner": "Baker", "age": 55, "pets": [ "Daisy" ] }
{ "owner_id": 3, "owner": "Clark", "age": 40, "pets": [ "Molly" ] }
{ "owner_id": 4, "owner": "Davis", "age": 31, "pets": [ "Lola", "Sadie", "Luna" ] }
【问题讨论】:
标签: sql json group-by aggregate-functions jq