我正在尝试在 rediSearch 中复制以下 SQL 查询:
%%sql
SELECT NumQuestions, COUNT(OwnerUserId) AS NumUsers
FROM (
SELECT OwnerUserId, COUNT(*) AS NumQuestions
FROM Posts
WHERE PostTypeId = 1
GROUP BY OwnerUserId
) AS PreguntasPorUsuario
GROUP BY NumQuestions
ORDER BY NumQuestions
LIMIT 34;
我已成功复制内部 SELECT,如下所示:
%%bash
redis-cli FT.AGGREGATE postsIndex \
"@PostTypeId:[1 1]" \
GROUPBY 1 @OwnerUserId \
REDUCE COUNT 0 AS NumPreguntas
问题是当我尝试像在 SQL 中那样将 COUNT 应用于 OwnerUserId 时。我无法应用它。
我尝试存储 rediSearch 查询中的信息以在另一个查询中使用它,但我也无法做到这一点。
如果需要更多背景信息或信息,我很乐意提供。我正在使用 Google Collab 和 redis-cli
RediSearch 的
COUNT
减速器不带任何参数。在 SQL 中,为 COUNT
提供参数会从行计数中删除缺少该字段值的行。
使用 RediSearch,您只需要过滤掉缺少给定字段值的行。
FT.AGGREGATE postsIndex "@PostTypeId:[1 1]"
GROUPBY 1 @OwnerUserId REDUCE COUNT 0 AS NumQuestions
FILTER "exists(@OwnerUserId)"
GROUPBY 1 @NumQuestions REDUCE COUNT 0 AS NumUsers
SORTBY 1 @NumQuestions MAX 34
在您的情况下,您按组值进行过滤,因此除非您期望一组
NULL
,否则您也可以删除过滤步骤,因为任何其他行无论如何都会通过它。
我认为您可能正在寻找的是
COUNT_DISTINCT
。在 RediSearch 查询语言中,COUNT
减速器计算每个组下的行数,而COUNT_DISTINCT
(和COUNT_DISTINCTISH
)计算特定字段中唯一值的数量。
如果这就是您想要查询的内容,请尝试:
FT.AGGREGATE postsIndex "@PostTypeId:[1 1]"
GROUPBY 1 @OwnerUserId REDUCE COUNT 0 AS NumQuestions
GROUPBY 1 @NumQuestions
REDUCE COUNT_DISTINCT 1 @OwnerUserId AS NumUsers
SORTBY 1 @NumQuestions MAX 34
我希望这能回答您的问题。查看聚合文档以获取更多信息以及过滤和减少的示例