2014-12-11 2 views
1

Я пытаюсь подсчитать идентификатор таблицы, где это последний статус не равен «Вызывается»Подсчет Distinct ID

Table1 ╔═════════╦════════╦══════════╗ ║ q_log_id║ q_id ║ q_status ║ ╠═════════╬════════╬══════════╣ ║ 1 ║ 1 ║ Waiting ║ ║ 2 ║ 1 ║ Waiting ║ ║ 3 ║ 1 ║ Called ║ ║ 4 ║ 2 ║ Waiting ║ ║ 4 ║ 2 ║ Waiting ║ ║ 5 ║ 3 ║ Waiting ║ ║ 5 ║ 3 ║ Waiting ║ ╚═════════╩════════╩══════════╝

Таким образом, счетчик должен вернуться 2. Я не очень хорошо с поэтому мне нужна помощь. Я пробовал подсчет с отличным, но это все еще не работает для меня.

+0

Что вы имеете в виду последний статус? пожалуйста, объясните, почему счет должен вернуться 2. Я не уверен, что вы пытаетесь сделать? –

+1

Ни '2', ни' 3', похоже, не имеют последнего статуса 'called', предполагая, что вы хотите сообщить' q_id', отсортированную по 'q_log_id'. Вы должны немного уточнить. – paxdiablo

ответ

2
SELECT COUNT(DISTINCT q_id) AS Count 
FROM table1 
WHERE q_id IN (
    SELECT q_id 
    FROM table1 
    GROUP BY q_id 
    HAVING MIN(q_status)<> 'Called' 
) 
2

вы можете сделать это с окном аналитической функции row_number, вы можете сделать заказ на q_log_id и разделить строки на q_id колонке и получить последнюю строку и проверьте состояние называется

SQL Fiddle

with cte 
as 
(
select * , row_number() over (partition by q_id order by q_log_id desc) as rn 
from table1 
) 
select count(q_id) 
from cte 
where rn =1 
and q_status !='Called' 
+0

спасибо! Это действительно трюк. – ezekiel

2

Если вы не заботитесь о том, чтобы «Called» являлась последней записью, вы можете подсчитать значения q_id, где «Called» никогда не появлялся.

SELECT COUNT(1) 
FROM 
(SELECT q_id 
    FROM table1 
    GROUP BY q_id 
    HAVING MAX(CASE WHEN q_status ='Called' THEN 1 END) IS NULL 
) AS v 

Это работает, потому что запрос

SELECT q_id,MAX(CASE WHEN q_status='Called' THEN 1 END) 
    FROM table1 
GROUP BY q_id 

дает NULL, если 'Вызывается' никогда не ассоциируется с q_id

Q_ID MAX(CASE WHEN Q_STATUS='CALLED' THEN 1 END) 
1  1 
2  (null) 
3  (null) 
Смежные вопросы