我试图计算其最后状态不等的表格的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)
您可以使用窗口分析函数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'
答案 1 :(得分:2)
如果您不关心“被叫”是最后一个条目,您可以计算“被叫”从未出现过的q_id值。
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
如果'Called'永远不与q_id 相关联,则给出NULL
Q_ID MAX(CASE WHEN Q_STATUS='CALLED' THEN 1 END)
1 1
2 (null)
3 (null)
答案 2 :(得分: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'
)