Имам една маса като тази:
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;
Ако вашата минимална стойност за 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;