【问题标题】:Subquery count() for postgres querypostgres 查询的子查询 count()
【发布时间】:2018-12-07 02:58:48
【问题描述】:

我有两个包含网络流量的表,我正在加入它们并在地图上进行可视化。

我正在尝试编写一个计数器来创建一个查询结果,其中计算特定 IP 地址在日志中出现的次数。我认为这将采用子查询的形式,返回主查询选择的特定行的行数。

当我运行以下查询时,我得到的错误是more than one row returned by a subquery used as an expression

select
squarespace_ip_addresses.ip,
squarespace_ip_addresses.latitude,
squarespace_ip_addresses.longitude,
st_SetSrid(ST_MAKEPOINT(squarespace_ip_addresses.longitude, squarespace_ip_addresses.latitude), 4326) as geom,
(select count(hostname) from squarespace_logs group by hostname) as counter,
squarespace_logs.referrer
from
squarespace_ip_addresses
left outer join
squarespace_logs
on
squarespace_ip_addresses.ip = squarespace_logs.hostname

向我建议的事情是选择中的子查询,它按主查询输出过滤,为每一行运行该查询。

有人有什么见解吗?

【问题讨论】:

    标签: postgresql gis aggregate-functions postgis


    【解决方案1】:

    在派生表中聚合数据(FROM 子句中的子查询):

    select
        a.ip,
        a.latitude,
        a.longitude,
        st_SetSrid(ST_MAKEPOINT(a.longitude, a.latitude), 4326) as geom,    
        c.count,
        l.referrer
    from squarespace_ip_addresses a
    left join squarespace_logs l on a.ip = l.hostname
    left join (
        select hostname, count(*)
        from squarespace_logs
        group by hostname
        ) c on a.ip = c.hostname
    

    【讨论】:

    • 所以基本上这是将三个表连接在一起,并通过接受您将获得两列并加入它们来解决多个返回列的问题。对吗?
    • 另外,为什么在子查询的select hostname, count(*) 中需要hostname?我不明白为什么不能只是select count(*)
    • 基本上是的。子查询中的hostname 用于连接主表。
    • 如何扩展它以仅查询 count 大于给定数字的行?
    • 在末尾添加where count > 10
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2021-04-14
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多