gpt4 book ai didi

sql - SQLite查询WHERE与OUTER JOIN

转载 作者:行者123 更新时间:2023-12-03 18:32:28 25 4
gpt4 key购买 nike

我对SQL有点生锈,并且在查询中遇到了一个小问题。在我们的应用程序中,我们有两个与此表有关的表。有条目,每个条目有N个步骤。

我们正在尝试优化查询,因此,我们一直在询问上次检查后更新的条目,而不是一直询问所有条目。可能有很多步骤,因此该查询仅应返回条目和一些步骤摘要数据,并且如果需要,我们可以单独查询步骤。

输入开始时间和更新时间分别从第一个和最近的处理步骤时间计算得出。我们还必须将进入状态分组在一起。

这是我们在python中构建时的查询,因为它似乎更易于阅读:

statement = 'SELECT e.serial_number, ' + \
'e.description, ' + \
'min(p.start_time) begin_time, ' + \
'group_concat(p.status) status, ' + \
'max(p.last_updated) last_updated, ' + \
'FROM entries e ' + \
'LEFT OUTER JOIN process_steps p ON e.serial_number = p.serial_number ' + \

# if the user provides a "since" date, only return entries updated after
# that date
if since is not None:
statement += ' WHERE last_updated > "{0}"'.format(since)

statement += ' GROUP BY e.serial_number'


我们面临的问题是,如果我们应用该 WHERE子句,它也会过滤流程步骤。因此,例如,如果我们有两种情况出现这种情况:

Entry: 123 foo
Steps:
1. start time 10:00, updated 10:30, status completed
2. start time 11:00, updated 11:30, status completed
3. start time 12:00, updated 12:30, status failed
4. start time 13:00, updated 13:30, status in_progress
Entry: 321 bar
Steps:
1. start time 01:00, updated 01:30, status completed
2. start time 02:00, updated 02:30, status completed


如果我们查询不带where的地方,我们将获得所有条目。因此,对于这种情况,它将返回:

321, bar, 01:00, "completed,completed", 02:30
123, foo, 10:00, "completed,completed,failed,in_progress", 13:30


如果我的时间是12:15,那么它只会返回以下内容:

123, foo, 12:00, "failed,in_progress", 13:30


因此,开始时间来自第3步,状态仅来自第3步和第4步。我要查找的是整个条目:

123, foo, 10:00, "completed,completed,failed,in_progress", 13:30


因此,基本上,我想基于该 last_updated值过滤最终结果,但是它目前也在过滤联接结果,因为 begin_timelast_updatedstatus值是用部分步骤。任何想法如何修改查询以获取我想要的内容?

编辑:

似乎这里也可能有一些命名问题。我在示例代码中使用的名称与我们在代码中实际使用的名称相同或相似。如果将 max(p.last_updated) last_updated更改为 max(p.last_updated) max_last_updated,并且也将 WHERE子句也更改为使用 max_last_updated,则会得到 OperationalError: misuse of aggregate: max()。我们还尝试在其中添加 AS语句,没有区别。

最佳答案

创建一个子查询,该子查询首先选择更新的进程:

SELECT whatever you need FROM entries e 
LEFT OUTER JOIN process_steps p ON e.serial_number = p.serial_number
WHERE e.serial_number in (SELECT distinct serial_number from process_steps
WHERE last_updated > "date here")
GROUP BY e.serial_number

关于sql - SQLite查询WHERE与OUTER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55654458/

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