标签: array-agg

Django ArrayAgg - 过滤带注释的数组

class Language(models.Model):
    iso_code = models.CharField()

class Publisher(models.Model)
    name = models.CharField()

class Book(modle.Model):
    name = models.CharField()
    language = models.ForeignKey(Language)
    publisher = models.ForeignKey(Publisher, related_name='books')

lang_ids = [1,2]

qs = Publisher.objects.annotate(
    x=ArrayAgg(
        Case(
            When(
                books__language__in=lang_ids,
                then="books__name"
            )
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

我想过滤 qs,如下所示 - https://docs.djangoproject.com/en/3.1/ref/contrib/postgres/fields/#len

qs.filter(x__len=2)
Run Code Online (Sandbox Code Playgroud)

为什么这样就无法过滤qs呢?我收到错误 IndexError:元组索引超出范围。

ArrayAgg 中的输出字段是 ArrayField

class ArrayAgg(OrderableAggMixin, Aggregate):
    function = 'ARRAY_AGG'
    template = '%(function)s(%(distinct)s%(expressions)s %(ordering)s)'
    allow_distinct = True

    @property
    def output_field(self):
        return ArrayField(self.source_expressions[0].output_field)

    def convert_value(self, value, expression, connection):
        if not value:
            return []
        return value
Run Code Online (Sandbox Code Playgroud)

django filter django-queryset django-rest-framework array-agg

3
推荐指数
1
解决办法
4564
查看次数

如何从标准 SQL 中的数组结构返回结构数组?

我的表上有一个我想要访问的非重复记录列。在此记录中,有几个重复的值。

所以它是一个RECORD,就像这样:

STRUCT<item ARRAY<STRING> unit_cost ARRAY<INT64> quantity ARRAY<INT64>> as costs
Run Code Online (Sandbox Code Playgroud)

例如。数据可能代表:

item ['cheese', 'ham', 'salad']
unit_cost [2, 5, 8]
quantity [1, 2, 1]
Run Code Online (Sandbox Code Playgroud)

所以我想将其作为更好的数据结构(结构数组)返回:

[
  {'item': 'cheese', 'unit_cost': 2, 'quantity': 1}, 
  {'item': 'ham', 'unit_cost': 5, 'quantity': 2}
  {'item': 'salad', 'unit_cost': 8, 'quantity': 1}
]
Run Code Online (Sandbox Code Playgroud)

我试过:

SELECT ARRAY_AGG(costs)
Run Code Online (Sandbox Code Playgroud)

但这会导致

            [
              {
                "item": ['cheese', 'ham', 'salad'],
                "unit_cost": [2, 5, 8],
                "quantity": [1, 2, 1]
              }
            ]
Run Code Online (Sandbox Code Playgroud)

这不是我期望它返回的结果。

是否可以在这里巧妙地使用标准 SQL从 a STRUCTof multipleARRAY变为 an ARRAYof multiple ? …

struct google-bigquery array-agg

2
推荐指数
1
解决办法
2万
查看次数

使用 ARRAY_AGG 获取列中的第一个非 NULL 值是否浪费?

我使用 PostgreSQL 14 来管理一个存储医生表更新的表:用户可以更新医生的名字、姓氏和/或年龄。更新操作未触及的字段具有值NULL

这是涉及两名不同医务人员的四次编辑的示例。ID 为 3 的医生收到了三个更新:前两个正在更新字段age,第三个涉及first_name

SELECT * FROM medic_edits;
Run Code Online (Sandbox Code Playgroud)
ID 医生ID 年龄
1 1 印地
2 3 59
3 3 63
4 3 鲍勃

我想合并此表,以便在结果表中每个医生有一行,提供累积编辑。这是我当前的查询及其产生的输出:

SELECT
  medic_id,
  (ARRAY_REMOVE(ARRAY_AGG(first_name ORDER BY id DESC), NULL))[1] AS first_name,
  (ARRAY_REMOVE(ARRAY_AGG(last_name ORDER BY id DESC), NULL))[1] AS last_name,
  (ARRAY_REMOVE(ARRAY_AGG(age ORDER BY id DESC), NULL))[1] AS last_name
FROM medic_edits
GROUP BY medic_id
;
Run Code Online (Sandbox Code Playgroud)
医生ID
1 印地
3 鲍勃 63

这正是我所期望的输出,但我怀疑这个ARRAY_REMOVE/ARRAY_AGG逻辑有点浪费。我想知道是否有一种方法可以在这里使用分区来获得良好的利润,该 …

sql postgresql greatest-n-per-group postgresql-performance array-agg

2
推荐指数
1
解决办法
652
查看次数

在 PL/PgSQL 中将返回的 SETOF 转换为数组(具体而言)

我知道有 的过程SELECT array_agg(f) FROM (SELECT blah FROM stuff) f,这在 SQL 中很棒,但是在 PL/pgSQL 中编写函数时,有没有简写方法?

我正在尝试将 JSON 键放入一个数组中,我可以用它来查看长度。就像是...

v_len := array_length( array_agg(json_object_keys(myjson)), 1);

而不是长, DECLARE a 变量,做 a SELECT array_agg(f) INTO ...,这是我一直在做的。我似乎已经使用相同的 SQL 字符串实现了数百种实现,但我真的很想减少我的代码,我的手指因所有多余的输入而变得麻木。

这种速记方法缺少什么?

postgresql plpgsql array-agg

1
推荐指数
1
解决办法
4706
查看次数

Postgresql聚合数组括号删除

如何从Array_AGG查询输出中删除括号{}?

ARRAY_AGG(DISTINCT(SGL.short_name))
Run Code Online (Sandbox Code Playgroud)

从此{01,02} 到此01|02|

谢谢!

postgresql array-agg

0
推荐指数
2
解决办法
2541
查看次数