You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

窗口内计算与外部列值的距离实现求助

解决方案:计算窗口内邻居与当前值的距离

问题根源

直接使用group_concat(x-x, ', ')得到全0,是因为这里的两个x都指向当前行的字段值,而非窗口范围内其他邻居的x。要计算邻居与当前值的距离,需要先将窗口内的每个邻居x与当前行x配对,计算距离后再聚合。

具体实现(SQLite为例)

通过CTE(公共表表达式)先展开所有符合条件的邻居配对,计算距离后再聚合:

WITH neighbor_pairs AS (
    SELECT 
        main.x AS current_x,
        neighbor.x AS neighbor_x,
        neighbor.x - main.x AS distance
    FROM demo main
    JOIN demo neighbor 
    ON floor(neighbor.x) BETWEEN floor(main.x) - 1 AND floor(main.x) + 1
)
SELECT 
    current_x AS x,
    group_concat(distance, ', ') AS neighbor_distances
FROM neighbor_pairs
GROUP BY current_x;

结果说明

执行后会得到每个x对应的邻居距离列表:

  • 0.6对应的距离:0, 0.5, 0.9
  • 1.1对应的距离:-0.5, 0, 0.4, 0.9
  • 1.5对应的距离:-0.9, -0.4, 0, 0.5
  • 2.0对应的距离:-1.4, -0.9, -0.5, 0

Apache Spark适配

如果使用Apache Spark,将group_concat替换为collect_list,逻辑一致:

import org.apache.spark.sql.functions._

val demoDF = spark.table("demo")

val neighborPairsDF = demoDF.alias("main")
  .join(demoDF.alias("neighbor"), 
        floor(col("neighbor.x")).between(floor(col("main.x")) - 1, floor(col("main.x")) + 1))
  .select(
    col("main.x").alias("current_x"),
    col("neighbor.x").alias("neighbor_x"),
    (col("neighbor.x") - col("main.x")).alias("distance")
  )

val resultDF = neighborPairsDF
  .groupBy("current_x")
  .agg(collect_list("distance").alias("neighbor_distances"))
  .withColumnRenamed("current_x", "x")

resultDF.show()

内容的提问来源于stack exchange,提问作者Andrei Iatsuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:35:19