我有点卡在这里,真的希望有人可以帮助我。 我还没找到谷歌的答案。
好的,请说数据如下:
TableName=> Events
| Node_Name| Status |
+----------+-----------+
| Node_1 | Completed |
| Node_1 | Completed |
| Node_2 | Failed |
| Node_2 | Completed |
| Node_3 | Failed |
| Node_3 | Failed |
查询:
select node_name, count(*)
from events
where status='Failed'
group by node_name
结果:
| Node_2 | 1 |
| Node_3 | 2 |
问题是,如何对从未“失败”并始终完成的node_name进行分组。
查询:?????????
我想要的结果:
=>Node_1
非常感谢您的帮助。
谢谢!
答案 0 :(得分:2)
在SQL Server中,<option>
运算符可以执行此操作。
EXCEPT
说明:您查询所有个不同的节点名称,并删除所有未完成的名称。结果,只剩下那些只能完成的人。
答案 1 :(得分:1)
SELECT
node_name
FROM
events
WHERE
node_name NOT IN (SELECT
node_name
FROM
events
WHERE
status = 'Failed')
GROUP BY
node_name
为了防止破坏结果集和jokester,将Abbracadabra添加为状态,您可以使用此功能。专利申请
WITH cteAbbracadabra AS
(
SELECT
node_name, status, RANK() OVER (PARTITION BY node_name ORDER BY status) rnk
FROM
events
GROUP BY
node_name, status
)
SELECT node_name
FROM cteAbbracadabra c
WHERE status = 'Completed'
AND NOT EXISTS (
SELECT *
FROM cteAbbracadabra
WHERE node_name = c.node_name
AND rnk <> c.rnk)
答案 2 :(得分:0)
或select node_name
from events
group by node_name
EXCEPT
select node_name
from events
where status<>'Completed' ;
...
http://sqlfiddle.com/#!6/60887/4
NOT EXISTS
答案 3 :(得分:0)
如果您在一个查询中查找所有状态,请尝试此操作(我使用的是SQL Server 2014):
SELECT
[Node_Name],
SUM(CASE WHEN [Status] = 'Failed' THEN 1 ELSE 0 END) AS Failures
FROM (VALUES
('Node_1', 'Completed'),
('Node_1', 'Completed'),
('Node_2', 'Failed'),
('Node_2', 'Completed'),
('Node_3', 'Failed'),
('Node_3', 'Failed')
) x ([Node_Name], [Status])
GROUP BY [Node_Name]
答案 4 :(得分:0)
仅获取“从未失败”的节点:
select node_name
from events
group by node_name
having max(status) = 'Completed'
要使所有节点都有“失败”计数:
select node_name,
sum(case when status = 'Failed' then 1 else 0 end )
from events
group by node_name
答案 5 :(得分:0)
您可以创建一个新列,您可以在其中为已完成的列分配“0”值,然后将其他所有值分配给1.然后,只抓取max()
值= 0(仅完成)的值:
SELECT t.node_name
FROM (
SELECT node_name
,STATUS
,CASE
WHEN STATUS = 'Completed'
THEN 0
ELSE 1
END Completed_Flg
FROM events
) t
GROUP BY t.node_name
HAVING max(t.completed_flg) = 0
答案 6 :(得分:0)
SerialPort.ReadExisting
这应该有用,所以在做了一些测试之后我发现我的原始解决方案没有用。但我觉得我现在找到了一个工作模式:
select node_name, count(*)
from events
where count(*) =
(SELECT count(*) from events where status = 'completed')
group by node_name;
因此,这将其显示为显示node_1 2.此时我遇到的问题是能够从最终结果中删除计数。我试图将其包装到另一个子查询中,我只使用in关键字来拉取node_name,但是因为我的子查询到目前为止每个都有两个操作数,所以它不会让我。我将继续尝试找到完成的工作模型,但这有助于推动您朝着正确的方向发展。
SELECT NODE_NAME, COUNT(*)
FROM EVENTS
GROUP BY NODE_NAME
HAVING(NODE_NAME, COUNT(*)) IN
(SELECT NODE_NAME, COUNT(*)
FROM EVENTS WHERE
STATUS = 'completed' GROUP BY NODE_NAME);
好吧,我已经设法搞清楚了,我有点傻到没有意识到这一点。
答案 7 :(得分:0)
这可以让你得到你想要的东西
select Distinct Node_Name, COUNT(Node_Name) NodeCount
from events e
where e.Status <> 'Failed'
AND e.Node_Name NOT IN
(
SELECT Node_Name
FROM events e
WHERE e.Status <> 'Completed'
)
GROUP BY Node_Name
返回:
Node_Name | NodeCount
Node_1 | 2
答案 8 :(得分:0)
我已经尝试了几个解决方案。 他们大多数都在工作。但我只需要最简单的一个,因为查询是针对在IBM DB2上运行的Tivoli Storage Manager(TSM)。
我知道最简单的方法可能存在一些缺陷,但我认为TSM不具备适应复杂查询的能力。
感谢您的时间。我很感激。抱歉回复晚了。我不知道回复会这么快。这是我的第一篇文章,我是SQL和TSM的新手:)
因此,在TSM Server中测试SQL查询之后。这很好用:
选择node_name 从事件 group by node_name 有max(状态)=&#39;已完成&#39;