有没有办法将每个项目与聚合值进行比较?

Is there a way to compare each item to a aggreated value?

我是 graphQL 和 Hasura 的新手。我正在尝试(在 Hasura 中)让我的用户提供自定义聚合(理想情况下以普通 graphQL 查询的形式),然后将每个项目的结果与聚合进行比较。

举个例子。假设我有这个模式:

USERTABLE:
userID
Name
Age
City
Country
Gender
HairColor

INCOMETABLE:
userID
Income

我在 hasura 中创建了一个关系,我可以查询数据,但我的用户想要对用户的收入水平进行自定义评分。例如,一位用户可能想查询按国家和性别细分的数据。

对于第一个例子,结果可能是:

{Country : Canada
 { gender : female
  { userID: 1, 
    Name: Nancy Smith,..
    #data below is on aggregated results
    rank: 1
    %fromAverage: 35%
  }...

我遇到困难的地方是显示用户信息相对于聚合数据的数据。

对于 Rank,我通过排序获得顺序,但我不确定如何显示相对排名,对于 %fromAverage,我完全不知道该怎么做。

有没有办法在 Hasura 中做到这一点?我怀疑 actions 可以做到这一点,但我不确定。

您可以使用跟踪 Postgres 视图。您的视图将包含您希望在 SQL 中计算的任意多个字段,并在您的 graphql api.

上作为单独的“table”进行跟踪

我在下面给出了基于简化的示例,其中您刚刚 table 调用了联系人,其中只有一个名为:id 的字段,它是一个自动整数。我只是将当前联系人的 ID 添加到 avg(id)(这是一种无用的尝试;只是为了说明......)。显然,您可以根据自己的喜好自定义逻辑。

视图的简单实现如下所示(确保在 hasura 中点击 'track this':

CREATE OR REPLACE VIEW contact_with_custom AS
SELECT id, (SELECT AVG(ID) FROM contacts) + id as custom FROM contacts;

Extend with views

另一种选择是使用计算域。这只是一个 postgres 函数,它将一行作为参数并 returns 一些数据,它只是向 Graphql API 中现有的 'table' 添加一个新字段,即 return 所述函数的值。 (你没有 'track this' 功能;一旦在 Hasura 的 SQL 部分创建,你将它添加为 'computed field' 下的 'Modify' 相关 table)重要的是要注意,此选项不允许您按此计算函数进行过滤,而在视图中,所有字段都是可过滤的。

在上面提到的相同架构中,计算字段的函数如下所示:

CREATE OR REPLACE FUNCTION custom(contact contacts)
RETURNS Numeric AS $$
    SELECT (SELECT AVG(ID) from contacts ) + contact.id
$$ LANGUAGE sql STABLE;

然后你 select 这个函数用于你的计算域,随便命名...

Computed fields