生成排列的通用区间范围表
生成排列的通用区间范围表。
在之前的文章中,我提供了一个如何使用返回日历日期的 UDF,以便从表值函数生成数据的示例。今天,我将使用类似的技术扩展此功能,但基于可以通用使用的区间范围表。如果您一直在关注我的博客,那么您会意识到我对模拟的兴趣。我今天要介绍的技术非常适合这种情况,因为我们可以将各种参数的组合生成到结果集中,然后将其连接到我们的源,以生成所需的数据组合进行测试。
首先,我们创建一个表来存储有关范围的信息以及我们希望如何生成它们
CREATE TABLE [Olap].[IntervalRange](
[RangeId] [int] IDENTITY(1,1) NOT NULL,
[RangeStart] [smallmoney] NOT NULL,
[RangeEnd] [smallmoney] NOT NULL,
[RangeType] [varchar](5) NOT NULL,
[RangeInterval] [smallmoney] NOT NULL,
[RangeGrade] [tinyint] NULL,
CONSTRAINT [PK_Range] PRIMARY KEY CLUSTERED
(
[RangeId] ASC
)) ON [PRIMARY]
以下是一些示例数据。RangeStart
指示范围内的第一个数字,RangeEnd
指示结束值,RangeInterval
确定生成范围时使用的增量。
RangeId(范围ID) | RangeStart(范围起始) | RangeEnd(范围结束) | RangeType(范围类型) | RangeInterval(范围间隔) | RangeGrade(范围等级) |
3 | -6 | 21 | ENTRY(入口) | 3 | NULL |
4 | 25 | 40 | ENTRY(入口) | 5 | NULL |
6 | 2 | 10 | EXIT(出口) | 2 | NULL |
7 | 13 | 25 | EXIT(出口) | 3 | NULL |
16 | 1 | 5 | EPS | 1 | NULL |
由此,我们可以轻松地连接数据,然后插入到包含组合的表中,以生成包含 EPS 等级、退出除数和入口阈值的策略列表
CREATE PROCEDURE [Olap].[GenerateStrategies]
AS BEGIN
INSERT INTO Olap.Strategy ( EPSGrade, EntryThreshold, ExitDivisor)
SELECT eps.Interval as EPSGrade,
e.Interval as EntryThreshold,
x.Interval as ExitDivisor
FROM Olap.view_RangeIntervals eps
CROSS JOIN Olap.view_RangeIntervals e
CROSS JOIN Olap.view_RangeIntervals x
WHERE eps.RangeType = 'EPS'
AND e.RangeType = 'ENTRY'
AND x.RangeType = 'EXIT'
AND NOT EXISTS (SELECT 0 FROM Olap.Strategy
WHERE e.Interval = EntryThreshold
AND x.Interval = ExitDivisor
AND eps.Interval = EPSGrade)
END
以下是参数交叉连接的最初几个结果和最后几个结果。我不会显示所有这些结果,因为事实证明,上面的 select
查询实际上总共生成了 700 行。这是因为总共有 5 个 EPS 区间、14 个 Entry 区间和 10 个 Exit 区间,计算结果为 5 X 14 X 10 或 700。因此,我们基本上从我们的 5 行区间范围蓝图数据生成了 700 个不同的组合。
RangeType(范围类型) | Interval | RangeType(范围类型) | Interval | RangeType(范围类型) | Interval |
EPS | 1 | ENTRY(入口) | -6 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | -3 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 0 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 3 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 6 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 9 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 12 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 15 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 18 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 21 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 25 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 30 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 35 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | 40 | EXIT(出口) | 2 |
EPS | 1 | ENTRY(入口) | -6 | EXIT(出口) | 4 |
EPS | 1 | ENTRY(入口) | -3 | EXIT(出口) | 4 |
EPS | 1 | ENTRY(入口) | 0 | EXIT(出口) | 4 |
EPS | 1 | ENTRY(入口) | 3 | EXIT(出口) | 4 |
EPS | 1 | ENTRY(入口) | 6 | EXIT(出口) | 4 |
EPS | ... | ENTRY(入口) | ... | ... | ... |
EPS | 5 | ENTRY(入口) | 35 | EXIT(出口) | 22 |
EPS | 5 | ENTRY(入口) | 40 | EXIT(出口) | 22 |
EPS | 5 | ENTRY(入口) | -6 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | -3 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 0 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 3 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 6 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 9 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 12 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 15 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 18 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 21 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 25 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 30 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 35 | EXIT(出口) | 25 |
EPS | 5 | ENTRY(入口) | 40 | EXIT(出口) | 25 |
就这样,从少量定义数据中获得了一大堆排列。一个需要注意的是,您最终可能会得到一些极端的组合,这些组合对于您的模拟来说没有意义。为了解决这个问题,我使用了一个排除表,该表是基于无效的策略组合生成的。然后将其反馈到流程中,以便策略排列通过左外连接进行链接,从而使排除列表中找到的那些不包含在生成例程中。