从 Couchbase N1Q1 查询返回的数组中获取最小值和最大值
Get minimum and maximum value from a Array returned from a Couchbase N1Q1 query
我有一个查询 return 是一组有序的文档键。我需要从这个 returned 数组中找到最小和最大键。
查询 return 文档键列表:
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,或让 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”),或者你需要将键解析为一个数字并按它排序(例如使用TONUMBER
, REGEXP_*
, 等)
我有一个查询 return 是一组有序的文档键。我需要从这个 returned 数组中找到最小和最大键。
查询 return 文档键列表:
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,或让 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”),或者你需要将键解析为一个数字并按它排序(例如使用TONUMBER
, REGEXP_*
, 等)