2017-08-17 135 views
2

我有这样的一个表:通过过滤多行选择查询

col | status 
----+------- 
1 | 0 
1 | 1 
2 | 1 
2 | 2 
3 | 1 
3 | 0 

我想有最大状态值只选择行。但也想忽略状态中是否有0。所以预期的行将如下(我忽略1和3的状态= 0)。

col | status 
----+------- 
2 | 2 

我只能根据max()选取行。但是当我添加另一个子句来过滤零时,它不起作用。

SELECT col, max(status) 
    FROM my_table 
WHERE 
    (select count(*) 
    from my_table t1 
    where t1.col = col 
    and status = 0) = 0 
GROUP BY col; 

任何指南都适合我。

回答

2

使用HAVING条款:

SELECT col, MAX(STATUS) 
FROM tab 
GROUP BY col 
HAVING SUM(CASE WHEN STATUS = 0 THEN 1 ELSE 0 END) = 0; 

DBFiddle


如果你对STATUS最小值为0那么你可以使用:

SELECT col, MAX(STATUS) 
FROM tab 
GROUP BY col 
HAVING MIN(STATUS) > 0; 
+1

呵呵,你一定是在开玩笑!谢谢。一旦我被允许接受,我会接受答案。 –

+2

不会HAVING MIN(状态)> 0更加自我解释? –

+1

@CaiusJard是的,我想到了,但我没有关于不同状态值的信息(如-1,-2)。在这种情况下,SUM()是相当一般和安全的。 – lad2025

0

我是一个新手在SQL,但我确定rank()将用于此目的。

select tabl.col, tabl.status from 
(select col, status, rank over(status desc) as rnk 
from tab where status = 0) tabl 
where tabl.rnk = 1 
and rownum = 1; 
+0

我明白你要去哪里,但这不太可能是OP想要的原因。它不会尝试排除任何行中状态为0的项目,并且如果状态的值最高为相同值的两倍,它可能会返回多个项目的行 –

+0

@CaiusJard, 已更新我的查询。希望这可以解决您的意见:) –