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
我的表上有一个我想要访问的非重复记录列。在此记录中,有几个重复的值。
所以它是一个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 ? …
我使用 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
我知道有 的过程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 字符串实现了数百种实现,但我真的很想减少我的代码,我的手指因所有多余的输入而变得麻木。
这种速记方法缺少什么?
如何从Array_AGG查询输出中删除括号{}?
ARRAY_AGG(DISTINCT(SGL.short_name))
Run Code Online (Sandbox Code Playgroud)
从此{01,02}
到此01|02|
谢谢!