我正在try 从每个父母那里获取所有子元素的计数(其中子子元素是重要的).

这是示例数据库(MSSQL).

INSERT INTO NODES VALUES(NULL, 1);
INSERT INTO NODES VALUES(NULL, 2);
INSERT INTO NODES VALUES(2, 3);
INSERT INTO NODES VALUES(1, 4);
INSERT INTO NODES VALUES(1, 5);
INSERT INTO NODES VALUES(3, 6);
INSERT INTO NODES VALUES(NULL, 7);
INSERT INTO NODES VALUES(NULL, 8);
INSERT INTO NODES VALUES(8, 9);
INSERT INTO NODES VALUES(7, 10);
INSERT INTO NODES VALUES(9, 11);
INSERT INTO NODES VALUES(11, 12);
INSERT INTO NODES VALUES(10, 13);
INSERT INTO NODES VALUES(10, 14);
INSERT INTO NODES VALUES(4, 15);

层级 struct 在哪里;

- 1
   - 4
      - 15
   - 5
- 2
   - 3
      - 6
- 7
   - 10
      - 13
      - 14
- 8
   - 9
      - 11
         - 12

而预期的结果是:

id Children Count
1 3
4 1
5 0
2 2
3 1
6 0
7 3
10 2
13 1
14 0
8 3
9 2
11 1
12 0

每次我制定策略来制定查询时,我都会达到必须在运行时迭代由查询形成的表的地步.

如果我对结果进行更深入的分组(使用父代ID),我可以只生成子代(不包括子代)的计数,这样我们就可以累加到根.但很明显,我需要迭代我在查询中形成的表,我不知道递归是否正确.

为了更好地表达自己,我会用我已经达到的部分和我想要做的事情来展示它;

WITH tree AS
(
    SELECT n1.parentid, n1.id, 1 AS level
    FROM NODES AS n1
    WHERE n1.parentid IS NULL
    UNION ALL
    SELECT n2.parentid, n2.id, level + 1 AS level
    FROM NODES AS n2
    INNER JOIN tree ON n2.parentid = tree.id
), levels AS 
(
  SELECT * 
  FROM tree
)
SELECT parentid, id, (COUNT(*) OVER(PARTITION BY parentid ORDER BY parentid)) AS childrencountofparentid, 
    ROW_NUMBER() OVER(ORDER BY parentid DESC) AS rownumber
FROM levels

其中,输出为:

parentid id childrencountofparentid rownumber
11 12 1 1
10 13 2 2
10 14 2 3
9 11 1 4
8 9 1 5
7 10 1 6
4 15 1 7
3 6 1 8
2 3 1 9
1 4 2 10
1 5 2 11
null 1 4 12
null 2 4 13
null 7 4 14
null 8 4 15

I want to do this: Actual query Full Image

我想使用前面行的结果,类似于LAG,但我必须迭代所有前面的行.

推荐答案

如果您不关心ID顺序,这里有一个有效的解决方案.不幸的是,我不知道如何按您所需的yields 来订货.如果没有什么,我希望它能帮助你找到解决方案,因为数据很好.

WITH cte as (
 SELECT p.Id as 'PID', c.Id as 'CID' FROM nodes p left join nodes c on p.id = c.ParentId
 UNION ALL
 SELECT c.PID,p.ID FROM cte c JOIN nodes p ON c.CID=p.ParentId
)
SELECT PID as id, count(*) as 'Children Count' FROM cte where CID IS NOT NULL GROUP BY PID 
UNION ALL
SELECT PID, 0 FROM cte WHERE CID IS NULL GROUP BY PID
ORDER BY PID ASC

Sql相关问答推荐

在SQL中向每个子字节组添加字节行

表名数组

BigQuery`喜欢ANY‘和`不喜欢ANY’

SQL查询:合并2个表

如果开始期间不存在PostgresSql回填数据

在SQL中使用类别值将行转置为列

在SQL中为两个日期之间的每个日期添加行

SQL递归.硬币兑换问题.-try 使用递归解决硬币找零问题

按用户和时间列出的SQL Group考勤列表

如何在Postgres中为单值输入多行?

在SQL中转换差异表的多列

SQL JSON_QUERY 使用列中的值构造 json 路径并接收错误

Netezza SQL:判断两个表是否相同

如何使用SELECT语句进行左连接,并根据右表中的特定值过滤结果?

如何将特定值从 JSON 列中的一个字段移动到 PostgreSQL 中的另一个字段?

如何根据与 BigQuery 中另一个表的匹配更新一个表中的列?

连续几天购买的客户

查找距上一条记录大于或等于 30 天的记录

奇怪的甲骨文行为

按 15 分钟递增计数分组,包括 0 计数