我想从表中获取数据,包括空行。例如:我想知道,在过去的30分钟里有没有什么活动。如果有什么东西,那么我就可以得到数据并且它可以工作,但是如何在没有任何活动的情况下包含这些记录呢?我所有的数据都在同一个表中。
谢谢!
╔═════╦═════════════════════╦══════╗
║ SRV ║ DATE ║ FLAG ║
╠═════╬═════════════════════╬══════╣
║ 1 ║ 2013-01-01 08:10:12 ║ 4 ║
║ 1 ║ 2013-01-01 08:11:24 ║ 4 ║
║ 1 ║ 2013-01-01 08:12:01 ║ 5 ║
║ 1 ║ 2013-01-01 08:12:14 ║ 5 ║
║ 2 ║ 2013-01-01 08:20:44 ║ 4 ║
║ 2 ║ 2013-01-01 08:23:11 ║ 5 ║
║ 1 ║ 2013-01-01 08:24:09 ║ 4 ║
║ 1 ║ 2013-01-01 08:28:54 ║ 5 ║
║ 1 ║ 2013-01-01 08:30:01 ║ 4 ║
║ 3 ║ 2013-01-01 08:32:31 ║ 4 ║
║ 3 ║ 2013-01-01 08:32:45 ║ 4 ║
║ 1 ║ 2013-01-01 08:35:21 ║ 4 ║
╚═════╩═════════════════════╩══════╝
我想得到状态为4的标志数,在过去10分钟内,在这种情况下,按SRV分组。当指定时间段内没有标志4时,应存在SRV为空值的记录。在这种情况下,我的查询应该返回:
╔═════╦═══════╦══╗
║ SRV ║ COUNT ║ ║
╠═════╬═══════╬══╣
║ 1 ║ 2 ║ ║
║ 2 ║ NULL ║ ║
║ 3 ║ 2 ║ ║
╚═════╩═══════╩══╝
我能够使用现有的标志来计数:
select srv, count(*)
from table1
where flag=4 and date >= now() - interval '10m'
group by svr
order by 1
最佳答案
尝试使用SUM,将返回0
select srv, SUM( CASE WHEN flag=4 THEN 1 ELSE 0 END )
from table1
where date >= now() - interval '10m'
group by svr
order by 1
如果确实需要空值,请将0替换为空值:
select srv,
CASE SUM( CASE WHEN flag=4 THEN 1 ELSE 0 END )
WHEN 0 THEN NULL
ELSE SUM( CASE WHEN flag=4 THEN 1 ELSE 0 END )
END
from table1
where date >= now() - interval '10m'now() - interval '10m'
group by svr
order by 1
如果在过去30分钟内没有具有某些SRV值的记录,则上述查询不会列出此SRV。
要更正此问题,可以使用此查询:
select srv,
SUM( CASE WHEN flag=4 AND date >= (now() - interval '10m')
THEN 1 ELSE 0 END )
from table1
group by srv
order by 1
但是这个查询将始终读取整个表,因此可能是无效的。
下面的版本读取所有SRV值(如果SRV列上有索引,则此操作应该很快),并且仅在表的子集上执行聚合(最近30分钟),因此可能比前一个版本快:
SELECT q1.srv, q2.cnt
FROM (
SELECT DISTINCT srv
FROM table1
) q1
LEFT JOIN (
select srv, count( * ) as cnt
from table1
where flag=4 AND date >= now() - interval '10m'
group by svr
) q2
ON q1.srv = q2.srv
关于postgresql - PostgreSQL-如何从同一个表中获取空(空)记录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20520395/