我正在尝试编写一个查询,该查询使用同一列的不同值从多行返回满足条件的ID。例如
>>conversion = colorsys.rgb_to_hsv(RC, GC, BC)
>>print(conversion)
>>#outputted data
>>(H,S,L)
我希望创建并激活的订单都成功。因此,返回行将为1。如果ID 2对于actiavte和create都成功,则返回将均为1和2。
我尝试过
ID | EVENT | STATUS
---------------------
1 | Create | Success
1 | Activate | Success
2 | Create | Success
2 | Activate | In Progress
但我认为语法不正确。
谢谢
答案 0 :(得分:2)
这就是您想要的:
select ID, EVENT, STATUS
from EOMSCHEMA.AUDIT_RECORDS
where event = 'Activate' and status = 'Completed'
and ID IN(SELECT ID FROM EOMSCHEMA.AUDIT_RECORDS WHERE event = 'Create' and status= 'Completed')
答案 1 :(得分:2)
我个人会发现这样的内容最容易阅读和理解(给我第一个查询中的所有内容,也提供给第二个查询中的所有内容)
select id
from audit_records
where event = 'Activate'
and status = 'Completed'
intersect
select id
from audit_records
where event = 'Create'
and status = 'Completed'
但这可能不是编写查询的最有效方法。像
select id
from audit_records
where status = 'Completed'
and event in ('Activate', 'Create')
group by id
having count(distinct event) = 2
可能更有效。但这可能不是立即显而易见的。从逻辑上讲,它将获取status
为“已完成”且event
为“激活”或“创建”的所有行。这样,两行都位于id = 1
处,而第一行只有id = 2
处。然后,它按id
进行汇总,并计算有多少个不同的event
值。 id = 1
具有两个不同的event
值(“激活”和“创建”),因此将其返回。 id = 2
只有一个不同的event
,因此将其删除。
如果您编写的查询偶尔需要运行并且数据量不太大,那么我建议使用intersect
方法来最大化程序员的理解力。如果您在代码的性能至关重要的部分中执行此操作,则可能需要group by
加上一些注释来说明其功能。
答案 2 :(得分:0)
如果要返回表的所有列,则可以使用EXISTS两次:
select t.ID, t.EVENT, t.STATUS
from EOMSCHEMA.AUDIT_RECORDS as t
where
exists (select 1 from EOMSCHEMA.AUDIT_RECORDS where ID = t.ID and event = 'Activate' and status = 'Completed')
and
exists (select 1 from EOMSCHEMA.AUDIT_RECORDS where ID = t.ID and event = 'Create' and status= 'Completed')
答案 3 :(得分:0)
您可以通过以下几种方法执行此操作:
select ID, EVENT, STATUS
FROM EOMSCHEMA.AUDIT_RECORDS
WHERE ID IN(SELECT ID FROM EOMSCHEMA.AUDIT_RECORDS WHERE EVENT = 'CREATE' AND STATUS = 'SUCCESS')
AND ID IN(SELECT ID FROM EOMSCHEMA.AUDIT_RECORDS WHERE EVENT = 'ACTIVATE' AND STATUS= 'SUCCESS');
此方法使用一系列子查询来确保满足所有条件,并将拉回与通过检查的ID相关联的所有行。
答案 4 :(得分:0)
根据记录的数量,这可能会比较慢,但是应该可以为您找到所需的内容。
您未指定sql版本。这是MSSQL,因此您可能需要进行一些细微调整。
SELECT
COMPLETED.ID,
COMPLETED.EVENT,
COMPLETED.STATUS AS CompletedStatus,
CREATED.STATUS as CreatedStatus
FROM
(SELECT ID, EVENT, STATUS
from EOMSCHEMA.AUDIT_RECORDS
where (event = 'Activate' and status = 'Completed') ) AS COMPLETED
INNER JOIN
(SELECT ID, EVENT, STATUS
from EOMSCHEMA.AUDIT_RECORDS
where (event = 'CREATE' and status = 'Completed') ) AS CREATED
on COMPLETED.ID = CREATED.ID
答案 5 :(得分:0)
select id from records where eventlog='activate' and
statuslog='success' and id in (select id from test where
eventlog='create' and statuslog ='success');
答案 6 :(得分:0)
类似的事情。
select * from audit_records
where id in (select id
from audit_records
group by id
having avg(case when status = 'Success' then 1 else 0 end) = 1);