我有一个Sqlite数据库,其中包含接近500,000行的访问日志信息。我将其用于汇总信息,例如“每个IP到达站点的次数”或“命中百分比为POST”等。
我编写了一个SQL查询,该查询收集每个IP地址访问该站点的次数,该站点的出现次数大于IP地址数量的1%。
select ip_address, count(ip_address)
from records
group by ip_address
having count(ip_address) > (select count(ip_address) from records) * .01
这将返回大约7个有效IP地址。如何将“所有其他”行合并到结果集中?
我尝试与逻辑相反的UNIONing
select "All Others", count(ip_address)
from records
group by ip_address
having count(ip_address) < (select count(ip_address) from records) * .01
但这会返回多个“所有其他”行,其顺序是连续的。
union all
当然使用..但这不能回答“问题”。
这个问题是第二个查询“返回多个”(就像第一个查询一样),因为这group by
是通过IP进行的,其中有很多。也就是说,每个组都有一个结果元组,而与select output子句中的任何操作无关。
期望的目标可能是对外部选择进行计数。
-- union all
select "All Others", sum(t.ct)
from (
select count(ip_address) as ct
from records
group by ip_address
-- note: <=, and not <, is inverse of >
having count(ip_address) <= (select count(ip_address) from records) * .01
) t
当然,如果知道“总计”和“找到”,那么“其他”就是“总计”-“找到”。
有趣的是,连续计数是无关紧要的。请记住,SQL可以按没有感觉到的顺序返回行,当行未order by
应用于物化结果集时(order by
严格保证不能在子选择中使用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句