postgresql - 如何使用 PostGIS 选择最近 X 个位置的平均价格?

标签 postgresql postgis

我想找到任何给定家庭的平均汽油价格。这是我当前的表格。

home_id  | geocoordinates
1        | 0101000020E61000005BB6D617097544
2        | 0101000020E61000005BB6D617097545
3        | 0101000020E61000005BB6D617097546
4        | 0101000020E61000005BB6D617097547
5        | 0101000020E61000005BB6D617097548

gas_price   |   geocoordinates
1           |   0101000020E61000005BB6D617097544
1           |   0101000020E61000005BB6D617097545
1           |   0101000020E61000005BB6D617097546
2           |   0101000020E61000005BB6D617097547
2           |   0101000020E61000005BB6D617097548
2           |   0101000020E61000005BB6D617097544
2           |   0101000020E61000005BB6D617097545
3           |   0101000020E61000005BB6D617097546
3           |   0101000020E61000005BB6D617097547
3           |   0101000020E61000005BB6D617097548
3           |   0101000020E61000005BB6D617097544
4           |   0101000020E61000005BB6D617097545
4           |   0101000020E61000005BB6D617097546
4           |   0101000020E61000005BB6D617097547

对于每个家庭,我想找到X个最接近的gas_prices的平均gas价格。例如,如果 X=5:

home_id     |   average_of_closest_five_gas_prices
1           |   1.5
2           |   2.5
3           |   2.1
4           |   1.5
5           |   1.5

我想出了使用一个单独的 home_id 的方法,但我正在努力弄清楚如何为所有人做到这一点。

select avg(gas_price) from (
                               SELECT *
                               FROM gas_price
                               ORDER BY gas_price.geocoordinates <-> '0101000020E61000005BB6D617097544'
                               LIMIT 5
                           ) as table_a

最佳答案

您可以使用lateral join限制 group by 中的组大小.

select home_id, avg(gas_price)
  from home,
    lateral (
      select gas_price
        from gas_price
        order by gas_price.geocoordinates <-> home.geocoordinates
        limit 5
    ) x
  group by home_id;

另一种选择是使用窗口函数:partition by home_id ,按距离排序并仅选择 row_number() <= 5 的行.

select home_id, avg(gas_price)
  from (
    select row_number() over w as r, *
      from home h, gas_price g
      window w as (partition by home_id order by g.geocoordinates <-> h.geocoordinates)
    ) x
  where r <= 5
  group by home_id;

关于postgresql - 如何使用 PostGIS 选择最近 X 个位置的平均价格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61464016/

相关文章:

sql - 我将如何编写此空间查询?

sql-server - 将 Postgis 表转换为 SQL Server 2008

macos - PostgreSQL:找不到命令

sql - 如何使用子查询(或许通过横向连接)优化 sql 查询?

ruby - 在 heroku 中运行的续集迁移产生 postgres 类型错误

postgresql - pgadmin 可以管理大对象吗?

python - 改进查询集中对象之间距离的计算

postgresql - ST_GeomFromText 是否比提供直接几何更好?

sql - 我可以将 Word 文档存储在 PostgreSQL 数据库中吗?

database - Power Query 日期格式