2016-05-02 8 views
0

元のメンバーをプライマリとし、複数の人が同じアカウントIDに属することができるデータがあります。 1つ以上のメンバーを持つアカウントIDごとにプライマリ以外のタイムスタンプを持つプライマリ以外のアカウントを返すクエリを作成しようとしています。Oracleの再帰的クエリ(グループ化されたデータ内のタイムスタンプの比較)

ID account ID Timestamp Primary 
1 111  4/26/2011 0:00 1 
2 112  4/26/2011 0:00 1 
3 112  4/27/2011 0:00 0 
4 113  4/26/2011 0:00 1 
5 113  4/29/2011 0:00 0 
6 113  4/28/2011 0:00 0 
7 114  4/26/2011 0:00 1 
8 114  4/26/2011 0:00 0 

私は、次の

ID account ID Timestamp Primary 
3 112   4/27/2011 0:00 0 
5 113   4/29/2011 0:00 0 
6 113   4/28/2011 0:00 0 

を返したい、次のようにフローは次のとおりです:

  1. > 1を持つすべてのアカウントIDを探すように、サンプルデータを使用して

    レコード

  2. これらのアカウントIDのそれぞれについて、非プライマリレコード(すなわち、プライマリ= 0)、タイムスタンプはそのアカウントIDのプライマリレコードよりも大きい。

要するに、後でアカウントに追加されたすべてのメンバーを検索しようとしています。

私はサブクエリと階層的なクエリを見てきましたが、間違いなくいくつかの助けを使うことができました。ありがとう!

答えて

1

Oracleのセットアップ

CREATE TABLE table_name (ID, account_ID, "Timestamp", "Primary") AS 
SELECT 1, 111, TIMESTAMP '2011-04-26 00:00:00', 1 FROM DUAL UNION ALL 
SELECT 2, 112, TIMESTAMP '2011-04-26 00:00:00', 1 FROM DUAL UNION ALL 
SELECT 3, 112, TIMESTAMP '2011-04-27 00:00:00', 0 FROM DUAL UNION ALL 
SELECT 4, 113, TIMESTAMP '2011-04-26 00:00:00', 1 FROM DUAL UNION ALL 
SELECT 5, 113, TIMESTAMP '2011-04-29 00:00:00', 0 FROM DUAL UNION ALL 
SELECT 6, 113, TIMESTAMP '2011-04-28 00:00:00', 0 FROM DUAL UNION ALL 
SELECT 7, 114, TIMESTAMP '2011-04-26 00:00:00', 1 FROM DUAL UNION ALL 
SELECT 8, 114, TIMESTAMP '2011-04-26 00:00:00', 0 FROM DUAL; 

クエリ

SELECT * 
FROM (
    SELECT t.*, 
     LAG(CASE "Primary" WHEN 1 THEN 1 END) IGNORE NULLS 
      OVER (PARTITION BY account_id ORDER BY "Timestamp", "Primary") 
      AS has_prev_primary 
    FROM table_name t 
) 
WHERE has_prev_primary = 1; 

出力

 ID ACCOUNT_ID Timestamp      Primary HAS_PREV_PRIMARY 
---------- ---------- ----------------------------- --------- ---------------- 
     3  112 2011-04-27 00:00:00.000000000   0    1 
     6  113 2011-04-28 00:00:00.000000000   0    1 
     5  113 2011-04-29 00:00:00.000000000   0    1 
+0

ありがとうございました!!これはまさに私が探していたものでした –

関連する問題