计算树形节点间的距离

要求:计算叶子结点和其上级的距离

表结构:

"Goods_Category"

(

  "Id" bigint,

  "ParentId" bigint

);

1.整理叶子结点及其上级的关系,按顺序存储成数组:[叶子结点1, 叶子结点1-上级Id1, 上级Id1的上级Id2...]

WITH T1 AS(WITH RECURSIVE T AS(
    --没有下级的就是叶子节点
    SELECT ARRAY[GC."ParentId"] || GC."Id" AS "ParentId"
    FROM "Goods_Category" AS GC
    JOIN "Goods_Category" AS GC1 ON
        GC."ParentId" = GC1."Id"
    WHERE NOT EXISTS (    
        SELECT 1
        FROM "Goods_Category" AS GC1
        WHERE GC."Id" = GC1."ParentId"
    )

UNION ALL (
        SELECT GC."ParentId" || T."ParentId" AS "ParentId"
         FROM T
         JOIN "Goods_Category" AS GC ON
            T."ParentId"[1] = GC."Id"
        JOIN "Goods_Category" AS GC1 ON
            GC."ParentId" = GC1."Id"
    )
)
SELECT T1."Id",
    T."ParentId"
FROM T
JOIN(
    WITH T1 AS(
        SELECT T."ParentId"[ARRAY_LENGTH(T."ParentId", 1)] AS "Id",
            ARRAY_LENGTH(T."ParentId", 1) AS LENGTH,
        T."ParentId"
    FROM T
    )
    SELECT T1."Id",
        MAX(T1.LENGTH) AS LENGTH
    FROM T1
    GROUP BY T1."Id"
) AS T1 ON
    T."ParentId"[ARRAY_LENGTH(T."ParentId", 1)] = T1."Id"
    AND ARRAY_LENGTH(T."ParentId", 1) = T1.LENGTH
ORDER BY T1."Id"
)
SELECT *
FROM T1;

2.循环T1记录

FOR R IN (SELECT * FROM T1) LOOP

  ARRAY_LENGTH = (ARRAY_LENGTH(R."ParentId", 1) - 1);

  FOR B_INDEX IN 1..ARRAY_LENGTH LOOP

    FOR E_INDEX IN (B_INDEX+1)..(ARRAY_LENGTH+1) LOOP

      IF NOT EXISTS(SELECT 1 FROM bi_dim_category_closure WHERE parent_id = R."ParentId"[B_INDEX] AND child_id = R."ParentId"[E_INDEX]) THEN

        INSERT INTO bi_dim_category_closure

        (

          parent_id,

          child_id,

          distance

        )

        VALUES(

          R."ParentId"[B_INDEX],

          R."ParentId"[E_INDEX],

          (E_INDEX-B_INDEX)

        );

      END IF;

    END LOOP;

  END LOOP;

END LOOP;

时间: 2024-12-19 03:33:08

计算树形节点间的距离的相关文章

计算GPS两点间的距离[单位为:米]

/**     * 计算GPS两点间的距离[单位为:米]     * @param center GPS当前数据(LonLat对象表示,LonLat.lon表示经度,LonLat.lat表示纬度)     * @param turnPoint 转向点经纬度对象     * @return     */    private double gpsDistance( LonLat center, LonLat turnPoint )    {        double distance = 0; 

sql 计算两经纬度间的距离

DECLARE @g geography;SET @g = geography::STPointFromText('POINT(113.216273 23.236333)', 4326);SELECT @g.ToString();DECLARE @gg geography;SET @gg = geography::STPointFromText('POINT(115.567368 37.341209)', 4326);SELECT @gg.ToString(); SELECT @g.STDist

杭电 1869 六度分离 (求每两个节点间的距离)

Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即只用6个人就可以将他们联系在一起,因此他的理论也被称为“六度分离”理论(six degrees of separation).虽然米尔格兰姆的理论屡屡应验,一直也有很多社会学家对其兴趣浓厚,但是在30多年的时间里,它从来就没有得到过严谨的证明,只是一种带有传奇色彩的假说而已. Lele

php向js的函数内传递参数-用经纬度计算2点间距离

有时候需要从php传递数据到js,这时候该怎么办呢?实例;php微信开发,用经纬度计算2点间的距离,2个坐标分别从php和js获得. 基于tp5框架的开发. 说一下注意事项: 1.php实际不能直接传递数据到js,他们两个没办法直接交互 2.可以通过一个桥梁交互,就是html 3.做法就是把js写在html页面内,然后再把把php传递过来的数据变量写在js代码内. 主要易混点在html页面 核心代码如下,从857行开始: <!DOCTYPE html> <!-- saved from u

计算两点间的距离

计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 208295    Accepted Submission(s): 72641 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y

计算两点间的距离-hdu2001

Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开. Output 对于每组输入数据,输出一行,结果保留两位小数. Sample Input 0 0 0 1 0 1 1 0 Sample Output 1.00 1.41 1 #include<stdio.h> 2 #include<math.h> 3 int main

HDOJ 2001 计算两点间的距离

计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 94573    Accepted Submission(s): 36296 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y

HDU 2001 计算两点间的距离

Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开. Output 对于每组输入数据,输出一行,结果保留两位小数. Sample Input 0 0 0 1 0 1 1 0 Sample Output 1.00 1.41 题意:输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. #include <stdio.h>

ios根据gps坐标来计算两点间的距离

//ios根据gps坐标来计算两点间的距离 //x1,y1 点1的坐标 x2,y2点2的坐标 -(double) gps2m:(double)x1 _y1:(double)y1 _x2:(double)x2 _y2:(double)y2{ double radLat1 = (x1 * 3.1416 / 180.0); double radLat2 = (x2 * 3.1416 / 180.0); double a = radLat1 - radLat2; double b = (y1 - y2)