0

次のシナリオがありますが、これを行う唯一の方法は、すべてのデータを一時テーブルに戻し、カーソルを使用してそれをループし、現在のレコードに応じてレコードまたは最後のレコードを更新することです。

基本的に、明確化と呼ばれるアクションが発生した場合、このレコードを返したいのですが、明確化の後に明確化保留が発生した場合、明確化を返したくありません。

問題は、明確化保留なしで任意の数の明確化が連続して発生する可能性があるため、5 つの明確化が発生してから 1 つの保留が発生した場合、4 つのレコードを返したいということです。説明は、保留の後に行うこともできます。この場合、説明を表示したいと思います。

カーソルよりも優れたソリューションへの提案がある人はいますか?

4

1 に答える 1

2

私はあなたのデータ構造について仮定を立てましたが、その理論はあなたにも当てはまるはずです

-- Example table
DECLARE @t table (
   action_description   char(20)
 , when_occured         datetime
);

-- Set up data
INSERT INTO @t (action_description, when_occured)
  VALUES ('clarification'     , DateAdd(mi, -9, Current_Timestamp)) -- Include
       , ('clarification'     , DateAdd(mi, -8, Current_Timestamp)) -- Include
       , ('clarification'     , DateAdd(mi, -7, Current_Timestamp)) -- Include
       , ('clarification'     , DateAdd(mi, -6, Current_Timestamp))
       , ('clarification hold', DateAdd(mi, -5, Current_Timestamp))
       , ('clarification'     , DateAdd(mi, -4, Current_Timestamp)) -- Include
       , ('clarification'     , DateAdd(mi, -3, Current_Timestamp)) -- Include
       , ('clarification'     , DateAdd(mi, -2, Current_Timestamp)) -- Include
       , ('clarification'     , DateAdd(mi, -1, Current_Timestamp)) -- Include
       , ('clarification'     , DateAdd(mi,  0, Current_Timestamp)) -- Include
       , ('clarification'     , DateAdd(mi, +1, Current_Timestamp))
       , ('clarification hold', DateAdd(mi, +2, Current_Timestamp))
       , ('clarification'     , DateAdd(mi, +3, Current_Timestamp)) -- Include
       , ('clarification'     , DateAdd(mi, +4, Current_Timestamp))
       , ('clarification hold', DateAdd(mi, +5, Current_Timestamp))
       , ('clarification hold', DateAdd(mi, +6, Current_Timestamp))
       , ('clarification'     , DateAdd(mi, +7, Current_Timestamp)) -- Include
       , ('clarification'     , DateAdd(mi, +8, Current_Timestamp))
       , ('clarification hold', DateAdd(mi, +9, Current_Timestamp));

; WITH all_actions AS (
  SELECT action_description
       , when_occured
       , Row_Number() OVER (ORDER BY when_occured) As row_num -- Provide a sequence for joining
  FROM   @t
)
SELECT a1.action_description
     , a1.when_occured
FROM   all_actions As a1
 LEFT
  JOIN all_actions As a2                            -- Join back to self
    ON a2.row_num = a1.row_num + 1                  -- on previous row
   AND a2.action_description = 'clarification hold' -- where the previous row had this action
WHERE  a1.action_description = 'clarification' -- Only want to show clarification actions
AND    a2.action_description IS NULL           --  and exclude those who had a row in the join
于 2013-07-23T14:47:42.507 に答える