如何为"来自其他行的数据组"算法生成测试数据

Apr*_*ion 5 sql testing algorithm greatest-n-per-group data-generation

更新:我正在寻找一种技术来计算我的算法的所有边缘情况(或任意算法)的数据.
到目前为止尝试的只是考虑可能是边缘情况+产生一些"随机"数据,但我不知道我怎么能更确定我没有错过真正的用户将能够弄乱的东西..

我想检查一下我没有错过我的算法中的重要内容,我不知道如何生成测试数据来涵盖所有可能的情况:

任务是报告每一个数据快照Event_Date,但要单独一行,可能属于编辑下一个Event_Date -见第2组)对输入和输出数据说明:

输入和输出数据图

我的算法:

  1. 为他们制作一个event_dates和计算列表next_event_date
  2. 加入的结果,main_audit_table并计算最大的transaction_id为每个快照(第1-4组在我的插图) -通过细分电子邮件id,event_date并根据是否2个选项transaction_date < next_event_date是真还是假
  3. 加入main_audit_table结果以获取相同的其他数据transaction_id
  4. 加入costs_audit_table结果 - 使用transaction_id小于transaction_id结果的最大值

我的问题:

  • 如何生成涵盖所有可能场景的测试数据,所以我知道我的算法正确吗?
  • 你能看到我算法逻辑中的任何错误吗?
  • 这类问题有更好的论坛吗?

我的代码(需要测试):

select
    snapshots.id,
    snapshots.event_date,
    main.event,
    main.transaction_date as last_change,
    costs.costs as costs_2012
  from (
    --snapshots that return correct transaction ids grouped by event_date
    select
      main_grp.id,
      main_grp.event_date,
      max(main_grp.transaction_id) main_transaction_id,
      max(costs_grp.transaction_id) costs_transaction_id
    from main_audit_table main_grp
    join (
      --list of all event_dates and their next_event_dates
      select
        id,
        event_date,
        coalesce(lead(event_date) over (partition by id order by event_date),
                 '1.1.2099') next_event_date
      from main_audit_table
      group by main_grp.id, main_grp.event_date
    ) list on list.id = main_grp.id and list.event_date = main_grp.event_date
    left join costs_audit_table costs_grp
      on costs_grp.id = main_grp.id and
         costs_grp.year = 2012 and
         costs_grp.transaction_id <= main_grp.transaction_id
    group by
      main_grp.id,
      main_grp.event_date,
      case when main_grp.transaction_date < list.next_event_date
           then 1
           else 0 end
  ) snapshots
  join main_audit_table main
    on main.id = snapshots.id and
       main.transaction_id = snapshots.main_transaction_id
  left join costs_audit_table costs
    on costs.id = snapshots.id and
       costs.transaction_id = snapshots.costs_transaction_id
Run Code Online (Sandbox Code Playgroud)

Fre*_*tka 3

公用表表达式 (CTE) 不仅是消除复杂性并减少较长 SQL 片段重复的好方法,而且还是表示测试数据的简单方法,就好像它来自永久表一样。至少,CTE 会将查询的主要组成部分集中在顶部,允许您在语句的其余部分通过标签来引用它们。Graeme Birchall 的DB2 SQL Cookbook(一本维护良好的免费电子书)提供了有关此模式和其他高级 SQL 模式的一些很好的示例。Joe Celko 是关于如何让 SQL 为您完成更多繁重工作的另一个很好的想法来源。