【问题标题】:Is there a way to compare each item to a aggreated value?有没有办法将每个项目与聚合值进行比较?
【发布时间】:2021-03-18 19:19:59
【问题描述】:

我是 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 中做到这一点?我怀疑行动可能能够做到这一点,但我不确定。

【问题讨论】:

  • 为什么不在您的客户端代码中即时计算?你的前端堆栈是什么?
  • @AbrahamLabkovsky 好问题!我只是提供一个 API,我的用户有他们自己的客户端软件。我认为如果他们可以直接通过查询进行评分,这将是一个很酷的增值。

标签: graphql hasura


【解决方案1】:

您可以使用跟踪 Postgres 视图。您的视图将包含您希望在 SQL 中计算的任意数量的字段,并在您的 graphql api 上作为单独的“表”进行跟踪。

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

视图的简单实现如下所示(确保在 hasura 中点击“跟踪此”:

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

Extend with views

另一种选择是使用计算域。这只是一个 postgres 函数,它以一行作为参数并返回一些数据,它只是在 Graphql API 中的现有“表”中添加一个新字段,即所述函数的返回值。 (您不“跟踪此”功能;一旦在 Hasura 的 SQL 部分中创建,您将其添加为相关表的“修改”下的“计算字段”)重要的是要注意,此选项不允许您过滤通过这个计算函数,而在视图中,所有字段都是可过滤的。

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

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

然后你为你的计算域选择这个函数,给它命名任何你喜欢的名字......

Computed fields

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2020-05-06
    • 2020-10-16
    • 1970-01-01
    相关资源
    最近更新 更多