1

誰かが私にトリッキーなSQLの問題についての手がかりを教えてもらえますか?私は同様の問題を検索しましたが、最も近いアプローチはこれに見えましたが、それは私の問題の解決策ではありません: Oracle-レコードのペア間のグループ化

これはPL/SQLプロシージャで実現できることは知っていますが、この場合(Oracle)SQLが必要です。プレーンテーブルのID=4および5の特別なレコードを分離するためのOracleSQLSELECTを探しています。このテーブルは、IDとDATEの2つの列のみで構成されています。次のようなデータが含まれています。

ID  DATE          REMARK (this row is not part of table!)
---------------   ------------------------------------------
2   01-JAN-2013     
4   02-JAN-2013   A  
7   03-JAN-2013  
5   05-JAN-2013   A  
6   07-JAN-2013  
4   08-JAN-2013   B  
1   11-JAN-2013  
5   12-JAN-2013   B  

... more follows  

ID 4と5のグループは、それぞれが時間内に続く場合、一緒に属します。したがって、「A」とマークした行は一緒に属します。「B」についても同じことが言えます。2つのAsと2つのBは、日付が連続しているため、一緒に属します。ここで取得したいのは、4つの列を返すSELECTです。つまり、1つの行に2つの行Aがあり、1つの行に行Bがあります。

したがって、出力は次のようになります。

ID4 DATE4        ID5 DATE5           Comment (no column, just comment)  
---------------------------------    ------------------------------------
4   02-JAN-2013  5   05-JAN-2013     First set of 4 and 5  
4   08-JAN-2013  5   12-JAN-2013     Second set of 4 and 5  

...more follows  

(列ID4とID5はもちろん、デモンストレーションの目的で廃止されています)

私は自分自身を理解できるようにしたいと思いますか?誰かアイデアがありますか?


更新:あなたのアイデアと選択に感謝します、私の質問をするのに十分に明確でなかったことを残念に思います。4と5のペアのみを考慮し、日付の昇順でのみ考慮してください。上記の例では、AlexPoolとFlorinGhitaのソリューションは素晴らしいです、ありがとう!
4erの日付は、5erの日付以下である必要があります。一致するパートナーがない4erまたは5erがある場合、それは無視できます。

しかし、ここに実際のデータと落とし穴のある別のサンプルがあります(ソリューションはここで失敗します):時間の順序でデータをウォークスルーすると、2つの行があり、5つが連続して続きます。

4    16.03.2012 17:49:28  A
5    10.05.2012 09:38:56  A1     Either A1 is possible
5    12.06.2012 07:51:03  A2     or A2 whichever is easier to code
4    12.06.2012 08:47:52  B
5    02.08.2012 11:27:43  B
4    03.08.2012 13:24:54  C
5    03.08.2012 14:14:07  C
4    04.08.2012 15:00:00      should be ignored, as there is no following 5er

必要な出力:

4    16.03.2012 17:49:28    5    10.05.2012 09:38:56   (alternat.:  5  12.06.2012 07:51:03)
4    12.06.2012 08:47:52    5    02.08.2012 11:27:43  
4    03.08.2012 13:24:54    5    03.08.2012 14:14:07  

提案されたSELECTSは、4erが5erより前にある必要があることを考慮していないため失敗します。対応するパートナーがない場合は、この行を無視してください。申し訳ありませんが、私は自分自身を十分に明確にしていませんでした。

フリードヘルムありがとうございます

4

3 に答える 3

0

分析を使用して自己結合しなくても可能です。

SELECT distinct 
         first_value(id) over (partition by rk order by dt), 
         min(dt) over (partition by rk),
         last_value(id) over (partition by rk order by dt rows between unbounded preceding and unbounded following) id5 ,
         max(dt) over (partition by rk) 
FROM (
SELECT id, dt, dense_rank() over (partition by id order by dt) rk 
FROM t
where  id in (4, 5)
)

これにより、「最初の」日付に対応する id の値が検出されるため、4 と 5 の日付の順序が逆の場合、5 が「4」列に表示されます。これがあなたが望むものかどうかは明らかではありません。

于 2013-02-13T09:00:14.840 に答える