Sql 基于其他列值按查询分组
假设我有一个名为Sql 基于其他列值按查询分组,sql,oracle,select,group-by,Sql,Oracle,Select,Group By,假设我有一个名为process\u states的表: +--------+--------+ |Process | State | ------------------- | A | 0 | | A | 0 | | B | 0 | | B | -1 | | C | -99 | ------------------- Note: State can have many more negative an
process\u states
的表:
+--------+--------+
|Process | State |
-------------------
| A | 0 |
| A | 0 |
| B | 0 |
| B | -1 |
| C | -99 |
-------------------
Note: State can have many more negative and positive state values
我要查找所有具有状态为0的行的所有进程。在上述情况下,我想得到A
我正在尝试使用分组方式
,有没有这样的方法:
select process from process_states
group by process
having <all state for that process is 0>
从进程状态中选择进程
分组处理
有
是否可以使用
分组依据
?您可以分组依据
处理列,并检查状态列的最大值和最小值是否为0
select process
from process_states
group by process
having max(state) = min(state) and min(state) = 0
您可以使用
having
子句来完成此操作。如果给定进程的行数等于带零的行数,则表示该进程只有带零的行
select process
from process_states
group by process
having count(*) = count(case when state = 0 then 'X' end)
您可以使用
group by
子句,并使用having
子句过滤流程:
SELECT process
FROM process_states
GROUP BY process
HAVING COUNT(CASE state WHEN -1 THEN 1 END) = 0
编辑:根据对其他答案的澄清意见,如果要求只查找只有
0
状态的流程,则可以计算总行数和0
状态的行数,并进行比较:
SELECT process
FROM process_states
GROUP BY process
HAVING COUNT(CASE state WHEN 0 THEN 1 END) = COUNT(*)
我很想使用
min
来实现以下目的:
select process
from process_status
group by process
having min(status) > -1;
这确实假设没有其他负面状态。试试这个
select process
from process_status
group by process
having sum(abs(status)) = 0
这正是我想要的。谢谢:)接下来的问题是,如果我想找到所有进程都有0或1,我可以在计数中使用
或吗?对于任何不仅仅是等式检查的简写形式的条件,您必须使用较长形式的case
:计数(状态为(0,1)时为case,然后为1 END)
。当然,您可以只使用两个when
子句:计数(0时的大小写状态为0,然后1时的大小写状态为1,然后1结束)
,但是,很糟糕。接下来的问题是,如果我想找到所有进程都有0或1,我可以在计数中使用或吗?将when state=0
更改为when state in(0,1)
。