0

これは、SQL サーバー ビューのすべての専門家にとって不十分な質問のように思えるでしょうが...

そのため、クライアントがレポート目的で必要とする小さなデータ セットがあります。私は彼らにレポートの要件を尋ねましたが、私のデータベースがより最適化される可能性があることを確認したのは今までではないことを認めなければなりません.

彼らが必要とするデータの 1 つは、実行された可能性のある 2 つのタスク間の時間差です。

select caseid, hy.createdate
from app_history hy
where hy.activityid in (303734, 303724)

これにより、ケース送信ごとに (編集後) 2 行が得られ、これらを測定する必要があります。アクティビティ 303734 は常に実行され、アクティビティ 303724 は実行される可能性があります。303734 と 303724 の各コンボが一致します。おそらく、ケースには、2 回目の提出時に、一致するペアを持つ 1 つの一致しない 303734 が含まれる可能性があります。これらを一致させることは、直感にかかっているかもしれません。良くない。ケース ID ごとに複数の提出がある可能性があり、その場合は、両方のアクティビティが後続のたびに実行されます。このテーブルに提出番号を書き込む方法はありません。

app_history テーブルは、userid、caseid、および activityid を外部キーとして保持します。PK は ID 列 ID です。

クエリを記述するより良い方法はありますか?

KM からの支援後:

select
    c.id, c.submissionno, hya.caseid, hya.createtime, hyb.caseid, hyb.createtime
    ,CASE
         WHEN hyb.caseid IS NOT NULL THEN DATEDIFF(mi,hya.createtime,hyb.createtime)
         ELSE NULL
     END AS Difference 
    from app_case c
        inner join app_history hya on c.id = hya.caseid 
        left outer join  app_history hyb on c.id = hyb.caseid  
    where hya.activityid in (303734) and hyb.activityid in (303724) order by c.id asc

これはほとんど機能します。

私は今この問題を抱えています:

460509|2|460509|15:15:39.000|460509|15:16:13.000|1
460509|2|460509|15:15:39.000|460509|15:18:13.000|3
460509|2|460509|15:17:52.000|460509|15:16:13.000|-1
460509|2|460509|15:17:52.000|460509|15:18:13.000|1

だから私は今、4つの行のそれぞれについて2つを比較して1つの行を取得しています...うーん、それは私が期待できる最高のものだと思います。:(

4

2 に答える 2

1

左結合を使用

SELECT
    a.caseid, a.createdate
        ,b.caseid, b.createdate
        ,CASE
             WHEN b.caseid IS NOT NULL THEN DATEDIFF(mi,a.createdate,b.createdate)
             ELSE NULL
         END AS Difference
    FROM app_history                a
        LEFT OUTER JOIN app_history b ON b.activityid=303724
    WHERE a.activityid=303734

もう少しスキーマ情報を 編集した後...

SELECT
    a.caseid, a.createdate
        ,b.caseid, b.createdate
        ,CASE
             WHEN b.caseid IS NOT NULL THEN DATEDIFF(mi,a.createdate,b.createdate)
             ELSE NULL
         END AS Difference
    FROM (SELECT MAX(ID) AS MaxID FROM app_history WHERE activityid=303734)                 aa
        INNER JOIN app_history                                                               a ON aa.MaxID=a.ID
        LEFT OUTER JOIN a(SELECT MAX(ID) AS MaxID FROM app_history WHERE activityid=303724) bb ON 1=1
        LEFT OUTER JOIN app_history                                                          b ON bb.MaxID=b.ID
于 2009-07-15T15:44:09.537 に答える