如何解决从 Couchbase N1Q1 查询返回的数组中获取最小值和最大值
我有一个返回一组有序文档键的查询。我需要从这个返回的数组中找到最小和最大键。
查询返回文档键列表:
SELECT RAW META(d).id
FROM `orders` AS d
WHERE META(d).id LIKE 'order:%'
ORDER BY META().id LIMIT 5
输出:
[
order:1,order:2,order:3,order:4,order:5
]
我需要从数组中获取最小值,因此我使用以下查询:
SELECT RAW ARRAY_MIN(
SELECT RAW META(d).id
FROM `orders` AS d
WHERE META(d).id LIKE 'order:%'
ORDER BY META().id LIMIT 5)
)
为了获得最大值,我在上面的查询中使用了 ARRAY_MAX 函数。
如您所见,我必须触发 2 个查询才能获得最小最大值。
问题:有没有办法在单个查询中从文档键数组中获取最小值和最大值?
解决方法
使用 CTE 或 LET pre 6.5.0
WITH aval AS (SELECT RAW META(d).id
FROM `orders` AS d
WHERE META(d).id LIKE 'order:%'
ORDER BY META().id LIMIT 5)
SELECT ARRAY_MIN(aval) AS min,ARRAY_MAX(aval) AS max;
您也可以使用以下内容,因为您的数组元素已排序。
WITH aval AS (SELECT RAW META(d).id
FROM `orders` AS d
WHERE META(d).id LIKE 'order:%'
ORDER BY META().id LIMIT 5)
SELECT aval[0] AS min,aval[-1] AS max;
,
为什么不是这样的查询?
SELECT MIN(META().id) AS min,MAX(META().id) AS max
FROM orders;
您不能在此查询中使用 RAW
,但如有必要,您可以解决该问题。
但我认为无论你怎么做都会遇到另一个问题:字典顺序。 Couchbase 文档键是字符串。例如。 “order:100”在字母表中排在“order:2”之前。所以你要么需要用前导零来制作你的键(例如“order:00002”而不是“order:2”),或者你需要将键解析为一个数字并按它排序(例如使用{ {1}}、TONUMBER
等)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。