-2
URN New_Value       Old_Value   Insert_Timestamp
1   A               B           01:00
2   C               A           02:00
3   A               D           03:00
4   B               E           04:00
5   G               B           05:00
6   I               J           06:00

URN 1 ~ 6 のみを抽出する必要があります。他のすべての URN には、またはそのタイムスタンプより前のタイムスタンプで既に使用されているいずれnew_valueかが含まれているためです。old_value

4

4 に答える 4

2

not exists節コードを使用してみてください:

select * from tab t
where not exists
(
  select * from tab t2
  where t2.Insert_Timestamp<t.Insert_Timestamp
  and (t.New_Value=t2.New_Value or t.Old_Value=t2.Old_Value or
       t.Old_Value=t2.New_Value or t.New_Value=t2.Old_Value )
)

SQL フィドルのデモ

于 2012-09-28T17:17:37.080 に答える
2
select t1.*
from MyTable t1
left outer join MyTable t2 on (t1.New_Value = t2.New_Value or t1.New_Value = t2.old_Value) 
    and t2.Insert_Timestamp < t1.Insert_Timestamp
left outer join MyTable t3 on (t1.Old_Value = t3.Old_Value or t1.Old_Value = t3.New_Value) 
    and t3.Insert_Timestamp < t1.Insert_Timestamp 
where t2.URN is null and t3.URN is null

SQL フィドルの例

于 2012-09-28T16:51:30.267 に答える
1

このスキーマと要件では、おそらくパフォーマンスが非常に悪くなりますが、

SELECT *
FROM   YourTable T1
WHERE  NOT EXISTS (SELECT *
                   FROM   YourTable T2
                   WHERE  T2.Insert_Timestamp < T1.Insert_Timestamp
                          AND ( T2.New_Value IN ( T1.New_Value, T1.Old_Value )
                                 OR T2.Old_Value IN ( T1.New_Value, T1.Old_Value ) )) 
于 2012-09-28T16:52:56.987 に答える
0

あなたが使用しているデータベースサーバーや最終的な目標が何であるかがわからないので、一般的な SQL ステートメントが機能する可能性があると想像できます。次のようなものを使用できます。

SELECT
 URN,
 New_Value,
 Old_Value,
 Insert_Timestamp
FROM
 table t
WHERE
 t.URN BETWEEN 1 AND 6
于 2012-09-28T16:50:04.717 に答える