/ / Изберете заявка, като филтрирате няколко реда - Oracle

Изберете заявка, като филтрирате няколко реда - оракул

Имам една маса като тази:

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 за отговор № 1

употреба 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;

0 за отговор № 2

Аз съм новак в SQL, но аз съм сигурен ранг () ще служи на целта.

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;