5

更新:私のアルゴリズム(またはそのことについては任意のアルゴリズム)のすべてのエッジケースのデータを計算する手法を探しています。
がこれまでに試したのは、エッジケースと「ランダムな」データの生成について考えているだけですが、実際のユーザーが混乱させる可能性のあるものを見逃さなかったと確信できる方法がわかりません。

アルゴリズムで重要なことを見逃していないことを確認したいのですが、考えられるすべての状況をカバーするテストデータを生成する方法がわかりません。

タスクは、すべてのデータのスナップショットを報告することですが、入力および出力データの図で、Event_Dateのデータに属する可能性のある編集用に別の行を作成します-グループ2)を参照してください:Event_Date

入出力データの図

私のアルゴリズム

  1. sのリストを作成し、それらのevent_datesを計算しますnext_event_date
  2. 結果を結合して、各スナップショットmain_audit_tableの最大値を計算しtransaction_idます(私の図のグループ1〜4)-、によってグループ化されid、trueevent_dateかどうかに基づいて2つのオプションによってグループ化されますtransaction_date < next_event_date
  3. 結果に参加main_audit_tableして、同じものから他のデータを取得しますtransaction_id
  4. 結果に参加する-結果よりも小さいcosts_audit_table最大のものを使用するtransaction_idtransaction_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 パターンやその他の高度な SQL パターンの良い例がいくつか掲載されています。Joe Celko は、SQL でより多くの面倒な作業を行う方法に関するアイデアのもう 1 つの優れた情報源です。

于 2012-04-25T20:51:21.933 に答える