65.9K
CodeProject 正在变化。 阅读更多。
Home

生成排列的通用区间范围表

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2009 年 8 月 4 日

CPOL

2分钟阅读

viewsIcon

10233

生成排列的通用区间范围表。

之前的文章中,我提供了一个如何使用返回日历日期的 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-621ENTRY(入口)3NULL
42540ENTRY(入口)5NULL
6210EXIT(出口)2NULL
71325EXIT(出口)3NULL
1615EPS1NULL

由此,我们可以轻松地连接数据,然后插入到包含组合的表中,以生成包含 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(范围类型)IntervalRangeType(范围类型)IntervalRangeType(范围类型)Interval
EPS1ENTRY(入口)-6EXIT(出口)2
EPS1ENTRY(入口)-3EXIT(出口)2
EPS1ENTRY(入口)0EXIT(出口)2
EPS1ENTRY(入口)3EXIT(出口)2
EPS1ENTRY(入口)6EXIT(出口)2
EPS1ENTRY(入口)9EXIT(出口)2
EPS1ENTRY(入口)12EXIT(出口)2
EPS1ENTRY(入口)15EXIT(出口)2
EPS1ENTRY(入口)18EXIT(出口)2
EPS1ENTRY(入口)21EXIT(出口)2
EPS1ENTRY(入口)25EXIT(出口)2
EPS1ENTRY(入口)30EXIT(出口)2
EPS1ENTRY(入口)35EXIT(出口)2
EPS1ENTRY(入口)40EXIT(出口)2
EPS1ENTRY(入口)-6EXIT(出口)4
EPS1ENTRY(入口)-3EXIT(出口)4
EPS1ENTRY(入口)0EXIT(出口)4
EPS1ENTRY(入口)3EXIT(出口)4
EPS1ENTRY(入口)6EXIT(出口)4
EPS...ENTRY(入口).........
EPS5ENTRY(入口)35EXIT(出口)22
EPS5ENTRY(入口)40EXIT(出口)22
EPS5ENTRY(入口)-6EXIT(出口)25
EPS5ENTRY(入口)-3EXIT(出口)25
EPS5ENTRY(入口)0EXIT(出口)25
EPS5ENTRY(入口)3EXIT(出口)25
EPS5ENTRY(入口)6EXIT(出口)25
EPS5ENTRY(入口)9EXIT(出口)25
EPS5ENTRY(入口)12EXIT(出口)25
EPS5ENTRY(入口)15EXIT(出口)25
EPS5ENTRY(入口)18EXIT(出口)25
EPS5ENTRY(入口)21EXIT(出口)25
EPS5ENTRY(入口)25EXIT(出口)25
EPS5ENTRY(入口)30EXIT(出口)25
EPS5ENTRY(入口)35EXIT(出口)25
EPS5ENTRY(入口)40EXIT(出口)25

就这样,从少量定义数据中获得了一大堆排列。一个需要注意的是,您最终可能会得到一些极端的组合,这些组合对于您的模拟来说没有意义。为了解决这个问题,我使用了一个排除表,该表是基于无效的策略组合生成的。然后将其反馈到流程中,以便策略排列通过左外连接进行链接,从而使排除列表中找到的那些不包含在生成例程中。

© . All rights reserved.