sql - 在父级别的 SQL 递归查询中查找 MIN 值?
问题描述
我有一个标准的递归查找脚本,它使用 CTE、“联合所有”、父子关系。我要解决的问题是我想从最低级别的子记录中捕获两个属性并将其放在最高级别的父记录中。
属性是:
父级子级的最大深度。在我的数据中,并非所有父母在孩子记录中的深度都相同。有些只跨越父级以下 1 级,有些跨越 10 级以下。在查询的输出中,我希望看到父记录包含其子项中的最大深度级别数。
我的数据中的所有记录都包含一个字段值,但该值仅在层次结构的最低级别上很重要。我希望查询输出父记录上最低级别子项的值。
桌子:
childid, name, keyfield, parentid, level
11, Sally, xyz123, null, 1
1, Alex, xyz456, 11, 2
7, John, abc123, null, 1
3, Erin, abc456, 7, 2
4, Jen, abc789, 3, 3
期望的输出:
childid, name, keyfield_max, keyfield_min
11, Sally, xyz123, xyz456
7, John, abc123, abc789
解决方案
SQL 服务器版本:
DECLARE @data TABLE(childid int, [name] nvarchar(128), keyfield varchar(30), parentid int, [level] int);
INSERT @data VALUES(11, 'Sally', 'xyz123', null, 1), (1, 'Alex', 'xyz456', 11, 2), (7, 'John', 'abc123', null, 1), (3, 'Erin', 'abc456', 7, 2), (4, 'Jen', 'abc789', 3, 3);
WITH cte AS (
SELECT d.*, d.childid AS topid FROM @data d WHERE d.parentid IS NULL
UNION ALL
SELECT d.*, cte.topid FROM cte INNER JOIN @data d ON cte.childid = d.parentid
)
SELECT
d.childid, d.[name], t.keyfield_max, t.keyfield_min
FROM @data d
OUTER APPLY (SELECT MAX(cte.keyfield) AS keyfield_max, MIN(cte.keyfield) AS keyfield_min FROM cte WHERE cte.topid = d.childid) t
WHERE d.parentid IS NULL
推荐阅读
- angular - 确保第一个 observable 在运行第二个(复杂的)之前已经运行
- javascript - 是否 $(document).unload(function() {}); 当 iframe 重定向顶级页面时工作?
- javascript - AWS QuickSight 嵌入仪表板在 Chrome 和 Firefox 中引发错误/警告
- uibutton - 在没有@objc 引用的情况下将目标添加到 UIButton
- msbuild - 带有 netstandard2.0 引用的 .net 4.8 项目不会通过 msbuild 构建
- angular - Angular 应用程序在本地工作,但在 Firebase 上不工作
- google-analytics - 为什么 totals.hit 大于 1 而 totals.timeOnSite 在 bigquery 中为空?
- python - 扑克 python 项目中我的发牌员类的问题
- python-3.x - 如何在 Python3 中与 os.system 连接
- javascript - 在 React 中按下按钮时重新渲染组件