2011-07-22 10 views
0

これは長いかもしれませんが、私は前に謝罪して、自分自身を説明しようとする "言葉"を得ることができます。私が必要とするほど簡潔であることを学んでいない。SQL Serverクエリのヘルプで、テーブルレイアウトの混乱を避けて行を引き出す

私の問題は、自分の経験が不足していることと、不十分にレイアウトされたテーブルだと私は信じていることです。私はテーブルから特定の列を取り出し、その要素の1つに埋め込まれた日付の違いについて報告する必要があります。 (下記のサンプルを参照)。

私の会社がヘルプデスクで使用しているアプリケーションの一部としてテーブルを再編成することはできないので、私はそれがどのように「組織化されているか」とついています。

テーブルの構造、基本的にこのです:すべての列の型が異なる長さのVARCHAR()され、データベースは、Windows Server 2003

管理が時間差を知りたい
tickID | tickGen | tickAudit 
    ---------------------------------- 
    124567 | 1  | 2011-07-22 08:00:00 joeuser Open Ticket 
    124567 | 2  | 2011-07-22 08:00:00 joeuser Open Ticket Not Assigned 
    124567 | 3  | 2011-07-22 08:00:00 joeuser Open Ticket Priority Urgent 
    124567 | 4  | 2011-07-22 09:00:00 freduser Open Ticket Add Assignee 

にSQL Server 2005で「joeuser」がチケットを「未割り当て」にしたときから、「freduser」がチケットに譲受人を追加したときのtickAudit列からの「タイムスタンプ」。この例では

私は私がより良いかもしれないと考えている「作品の並べ替え」が、これらのクエリを思い付いた:

declare @startTime datetime 
    declare @endTime datetime 
    declare @mrid varchar(6) 
    set @mrid = '124567' 
    select @startTime = cast(substring(tickAudit,1,19) as datetime) 
     from tickHistory where tickID = @tickID and tickAudit like '%Not Assigned' 
    select @endTime = cast(substring(tickAudit,1,19) as datetime) 
     from tickHistory where tickID = @tickID and tickAudit like '%Add Assignee' 
    select @mrid as 'ticket', @startTime as 'startTime', 
     @endTime as 'endTime', datediff(mi,@startTime,@endTime) as 'diff' 

クエリはしかし、「チケット」はそれ複数のエントリを持っている問題を扱うことができません割り当てられた後、この例のように割り当てられていませんでした:チケットを編集した。ここ

tickID | tickGen | tickAudit 
    ---------------------------------- 
    124568 | 1  | 2011-07-22 08:00:00 joeuser Open Ticket 
    124568 | 2  | 2011-07-22 08:00:00 joeuser Open Ticket Not Assigned 
    124568 | 3  | 2011-07-22 08:00:00 joeuser Open Ticket Priority Urgent 
    124568 | 4  | 2011-07-22 09:00:00 freduser Open Ticket Add Assignee 
    124568 | 5  | 2011-07-22 11:00:00 freduser Open Ticket Not Assigned 
    124568 | 6  | 2011-07-22 12:00:00 bobuser Open Ticket Priority Low 
    124568 | 7  | 2011-07-22 12:00:00 bobuser Open Ticket Add Assignee 

「freduser」と今では「割り当てられていない」され、再び、2時間後に「bobuserは、」それを編集しており、チケットを割り当て。だから私は報告する必要がある2つのタイムスタンプがあります。私のクエリは、tickGen#5とtickGen#7の違いだけを返します。これは、tickGen#2とtickGen#4の違いを無視します。または、返された数にかかわらず、最後に有効な一致がクエリに表示されていると思われます。

これは私が立ち往生する場所です。上記の例では、誰かが私にいくつかの提案や状況を説明するための例を与えてくれることを願っています。ここで

答えて

1

はそれを行うための一つの方法である:

with th (tickID,tickGen,tickTime,tickType) 
as 
(select tickID,tickGen, 
    cast(substring(tickAudit,1,19) as datetime) as tickTime, 
    RIGHT(tickAudit,12) 
from tickHistory 
where RIGHT(tickAudit,12) in ('Not Assigned','Add Assignee')) 

select t1.tickID, 
    t1.tickTime startTime, 
    t2.tickTime endTime, 
    DATEDIFF(mi,t1.tickTime,t2.tickTime) as diff 
from th as t1 
    inner join th as t2 
     on t1.tickID = t2.tickID 
      and t1.tickGen < t2.tickGen 
where t1.tickType = 'Not Assigned' 
    and t2.tickType = 'Add Assignee' 
    and t2.tickGen = (select MIN(tickGen) from th 
       where th.tickID = t1.tickID  
        and th.tickGen > t1.tickGen)