计算不同的ID

时间:2014-12-11 01:25:44

标签: sql sql-server count

我试图计算其最后状态不等的表格的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.我对查询不好,所以我需要一些帮助。我尝试过与众不同,但它仍然不适合我。

3 个答案:

答案 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'
)