【发布时间】:2023-03-28 09:35:01
【问题描述】:
我有一堆测试数据。每个测试都进行了几十次,并且在 CTE 中计算了每个测试的平均值和误差范围。在下一步中,我想对每个测试子组进行dense_rank。这是我正在寻找的数据子组和排名值的示例:
AvgScore StdErr DesiredRank
65550 2109 1
67188 2050 1
67407 2146 1
67414 1973 1
67486 1889 2
67581 2320 2
67858 1993 2
68509 2029 2
68645 2039 2
68868 2051 2
68902 1943 2
69305 1564 3
69430 2037 3
69509 1594 3
387223 12521 4
389709 12975 4
392200 11344 4
398916 11755 4
399018 11480 5
401144 11021 5
401640 10973 5
403442 10688 5
请注意,每个分数的误差幅度使得许多分数在表面上是相等的。是的,这会导致某些行在技术上属于多个组,但使其成为最近组的一部分会得到最准确的结果。
我查看了Grouping data into fuzzy gaps and islands,但这个版本似乎要复杂得多,因为从一组切换到另一组不仅需要两行在彼此的误差范围内,而且可能会在等效行之间发生切换。
以下是示例中出现的最复杂的情况:第 1 行在其范围内有第 2-6 行,尽管第 6 行也在第 1 行的范围内,但第 5 行在其范围内没有第 1 行,因此新排名必须从第 5 行开始。
结果集中只有几百个组,因此性能应该不是问题。我只是在努力寻找不仅可以在有序范围内同时查看两个方向的逻辑,而且还可以认识到某些中间行已经强制启动了一个新组。显然,使用游标很简单,但在排名之后我还有额外的处理要做,所以如果可能的话,我正在寻找基于 SET 的解决方案。
我在 2017 年,但如果有一个基于集合的非递归答案需要 2019 年,我可以接受。
【问题讨论】:
-
您有 SQL Server 2012 或更高版本吗?
-
这不是您所需要的,但我希望它可以作为一个起点:demo 这是一种天真的方法 - 获取组的第一个元素并添加 stderr,当实际值 > newRange 时更改组。
-
谢谢。递归 CTE 不是我的首选,但它们在特定情况下肯定很有用。
标签: sql-server gaps-and-islands