假设我有下表:
NUM TYPE STAT ERR
123 10 6 62
123 10 6 62
123 10 6 62
123 17 4 0
321 10 6 62
321 10 6 62
我当前正在使用以下查询:
select MIN(NUM) as NUMBER
, MIN(STAT) as STATUS
, MIN(ERR) as ERROR
, MIN(retry) as RETRY
from TABLE_TB
where ERR=62
group by NUM
having count(ERR) > 1;
输出将是:
NUM TYPE STAT ERR RETRY
123 10 6 62 3
321 10 6 62 2
没关系,但是我需要的是查询将仅输出NUM
,具有ERR = 62,但也具有ERR = 0,排除那些具有ERR = 62但不具有ERR = 0的人。以第一个表为例,查询应该输出
NUM TYPE STAT ERR RETRY
123 10 6 62 3
这是因为NUM 123的ERR = 62(发生3次)而且ERR = 0。因此,NUM 321将被排除,因为即使ERR = 62,也没有ERR = 0。
希望是未来:)
非常感谢。 卢卡斯
答案 0 :(得分:1)
您可以使用子查询:
SELECT num
, MIN(type) AS type
, MIN(stat) AS status
, MIN(err) AS err
, COUNT(*) AS retry
FROM table_tb
WHERE err != 0 AND
num IN (SELECT num FROM tb WHERE err = 0)
GROUP BY num;
或不使用子查询:
SELECT num
, MIN(CASE WHEN err != 0 THEN type END) AS type
, MIN(CASE WHEN err != 0 THEN stat END) AS stat
, MIN(CASE WHEN err != 0 THEN err END) AS err
, COUNT(CASE WHEN err != 0 THEN 1 END) AS retry
FROM table_tb
GROUP BY num
HAVING COUNT(DECODE(err, 0, 1)) > 0;
输出:
+-----+------+------+-----+-------+
| NUM | TYPE | STAT | ERR | RETRY |
+-----+------+------+-----+-------+
| 123 | 10 | 6 | 62 | 3 |
+-----+------+------+-----+-------+
答案 1 :(得分:1)
您需要首先过滤err in (62, 0)
上的表,然后找到您有多少种不同的错误类型(您需要2种,因为您有两个感兴趣的错误代码)。
一旦有了这些信息,就可以过滤err = 62且非重复计数= 2的行-例如:
WITH results as (select num,
type,
stat,
err,
retry,
count(distinct err) over (partition by num) num_err_types
from table_tb
where err in (62, 0))
select min(num) as nmbr,
min(stat) as status,
min(err) as ERROR,
min(retry) as retry
from results
where err = 62
and num_err_types = 2;
我使用了COUNT()
分析函数来查找不同的计数-这样,无论错误代码如何,都将值添加到每一行,这使我们能够在最终查询中对其进行过滤。
答案 2 :(得分:1)
或者您可以尝试这种简单而甜蜜的方式...
select MIN(NUM) as NUMBER
, MIN(STAT) as STATUS
, MAX(ERR) as ERROR
, Count(*) as RETRY
from TestTable
where ERR IN (62 ,0)
group by NUM
having count(ERR) > 1 AND MIN(ERR)=0;