5

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

我想检查一下我的算法中没有遗漏一些重要的东西,而且我不知道如何生成测试数据来涵盖所有可能的情况:

任务是报告每个数据的快照,Event_Date但为可能属于下一个Event_Date的编辑创建单独的行- 请参阅第 2 组)输入和输出数据插图

输入输出数据说明

我的算法

  1. 列出s 并为它们event_date计算snext_event_date
  2. 将结果加入main_audit_table并计算transaction_id每个快照的最大值(我的插图中的第 1-4 组) -根据是否为真id,由 和 2 个选项分组event_datetransaction_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
4

1 回答 1

3

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

于 2012-04-25T20:51:21.933 回答