en supposant que j'ai le tableau suivant:
NUM TYPE STAT ERR RETRY 123 10 6 62 3
J'utilise actuellement la requête suivante:
NUM TYPE STAT ERR RETRY 123 10 6 62 3 321 10 6 62 2
Le résultat sera:
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;
C'est correct, mais ce dont j'ai besoin, c'est que la requête ne produira que NUM
WITH ERR = 62 mais aussi avec ERR = 0 à l'exclusion ont ERR = 62 mais sans ERR = 0. En prenant le premier tableau comme exemple, la requête doit afficher
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
Ceci car NUM 123 a ERR = 62 (3 occurrency) mais aussi ERR = 0. Donc, NUM 321 sera exclu car même s'il a ERR = 62, il n'a pas ERR = 0.
L'espoir est clair :)
Merci beaucoup. Lucas
3 Réponses :
Vous pouvez utiliser une sous-requête:
+-----+------+------+-----+-------+ | NUM | TYPE | STAT | ERR | RETRY | +-----+------+------+-----+-------+ | 123 | 10 | 6 | 62 | 3 | +-----+------+------+-----+-------+
ou vous passer d'une sous-requête:
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;
Résultat:
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;
Merci de me montrer l'exemple de sous-requête (et sans sortie). Je dois encore l'essayer, mais le concept est clair.
Vous devez d'abord filtrer le tableau sur err in (62, 0)
, puis rechercher le nombre de types d'erreur distincts que vous avez (vous en voulez 2, car vous avez deux codes d'erreur que vous intéressé par).
Une fois que vous avez cette information, vous pouvez ensuite filtrer sur les lignes où l'erreur = 62 et le nombre distinct = 2 - par exemple:
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;
J'ai utilisé la fonction analytique COUNT ()
pour trouver le décompte distinct - de cette façon, la valeur est ajoutée à chaque ligne, quel que soit le code d'erreur, ce qui nous permet de filtrer dessus dans la requête finale.
Merci, cela me semble un peu compliqué, mais je vais l'essayer bientôt en espérant pouvoir le comprendre.
Ou peut-être pouvez-vous essayer de cette façon, simple et douce ...
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;
Merci, oui c'est très simple et il semble que cela fonctionne parfaitement!