gpt4 book ai didi

python - 过滤具有相邻 ID 的 SQL 元素

转载 作者:行者123 更新时间:2023-11-29 12:40:35 24 4
gpt4 key购买 nike

我真的不知道如何在标题中正确陈述这个问题。

假设我有一个表Word,如下所示:

| id  | text   |
| --- | --- |
| 0 | Hello |
| 1 | Adam |
| 2 | Hello |
| 3 | Max |
| 4 | foo |
| 5 | bar |

是否可以根据text查询这张表,得到主键(id)恰好为一个的对象?

如果我这样做

Word.objects.filter(text='Hello')

我得到一个包含行的 QuerySet

| id  | text   |
| --- | --- |
| 0 | Hello |
| 2 | Hello |

但我想要行

| id  | text   |
| --- | --- |
| 1 | Adam |
| 3 | Max |

我想我可以做

word_ids = Word.objects.filter(text='Hello').values_list('id', flat=True)
word_ids = [w_id + 1 for w_id in word_ids] # or use a numpy array for this
Word.objects.filter(id__in=word_ids)

但这似乎并不过分有效。有没有一种直接的 SQL 方法可以在一次调用中执行此操作?最好直接使用 Django 的 QuerySets?

编辑: 这个想法实际上是我想过滤第二个 QuerySet 中的那些词。像这样的东西:

Word.objects.filter(text__of__previous__word='Hello', text='Max')

最佳答案

在普通的 Postgres 中你可以使用 lag 窗口函数 ( https://www.postgresql.org/docs/current/static/functions-window.html )

SELECT 
id,
name
FROM (
SELECT
*,
lag(name) OVER (ORDER BY id) as prev_name
FROM test
) s
WHERE prev_name = 'Hello'

lag 函数添加一个包含前一行文本的列。因此,您可以在子查询中按此文本进行过滤。

demo:db<>fiddle


我不是很喜欢 Django,但喜欢 documentation意味着,在 2.0 版本中,已经添加了窗口函数的功能。

关于python - 过滤具有相邻 ID 的 SQL 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52459844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com