友人のグループからの質問:
問題と時間の彼のブログのリンクSQL期間とセットを取り、マージhttps://blog.csdn.net/Seandba/article/details/105152412
Q:オープンチャネルの長さの合計がいずれかの端末の開口部が、困難は、各種端子時間を含む重なった場合でも限り開放通路が存在するように、算出されます
質問テストデータ
-問題は、試験データ-開口(H)の全長算出 TRUNCATE TABLE XCPと、 INSERT INTO XCP値( 'A1'、TO_DATE('20、200317午前一時00'分00秒、 'YYYYMMDD HH24' 1' :miザ: SS ')、TO_DATE(' 20200317午前六時00分00秒'' YYYYMMDD HH24:MIザ:SS ')); INSERT INTO XCP値(' 2 '' A1 'TO_DATE('午前一時00分00秒20200317」、 'YYYYMMDD HH24:MIザ:SS')、TO_DATE('20、200317六時○○分00'秒、 'YYYYMMDD HH24:MIザ:SS')); INSERT INTO XCP値( '2'、 'A1'、TO_DATE('01 20200317 :00:00 '' YYYYMMDD HH24:MIザ:SS ')、TO_DATE(' 20200317 8時00分00秒'' YYYYMMDD HH24:MIザ:SS ')); INSERT INTO XCP値(' 2 '' A1 ' 、TO_DATE( '20200317午前2時00分00秒'、 'YYYYMMDD HH24:MI:SS')、TO_DATE( '20200317午前七時00分00秒'、 'YYYYMMDD HH24:MI:SS')); XCP値( '2'、 'A1'に挿入、TO_DATE( '20200317午前3時○○分00秒'、 'YYYYMMDD HH24:MI:SS')、TO_DATE( '20200317 7時00分00秒'、「YYYYMMDD HH24:MI :SS')); )、TO_DATE( '20200317午前9時00分00秒'、「YYYYMMDD HH24:MI XCP値( '2'、 'A1'、TO_DATE( '20200317午前5時00分00秒'、 ':MI SS YYYYMMDD HH24'への挿入:SS「)); XCP値( '3'、 'A1'に挿入、TO_DATE( '20200317午前9時00分00秒'、 'YYYYMMDD HH24:MI:SS')、TO_DATE( '20200317午前11時00分○○秒'、「YYYYMMDD HH24:MI :SS')); XCP値( '3'、 'A1'に挿入、TO_DATE( '20200317午前12時○○分00秒'、 'YYYYMMDD HH24:MI:SS')、TO_DATE( '20200317夜01時00分00秒'、「YYYYMMDD HH24:MI :SS')); XCP値( '2'、 'A1'に挿入、TO_DATE( '20200317夜2時00分00秒'、 'YYYYMMDD HH24:MI:SS')、TO_DATE( '20200317午後七時○○分00秒'、「YYYYMMDD HH24:MI :SS「)); 「(XCP値( '3'、 'A1'、TO_DATEに挿入 「(XCP値( '3'、 'A1'、TO_DATEに挿入 XCP値( '3'、 'A1'に挿入、TO_DATE( '20200317夜6時00分00秒'、 'YYYYMMDD HH24:MI:SS')、TO_DATE( '20200317午前21時00分○○秒'、「YYYYMMDD HH24:MI :SS')); コミット; XCP SELECT * FROM。
問題の核心は、複数のレコード間の労働組合の操作を求めることで、私は次のSQLを書きました
- 。問題1 WITH TMP1 AS( -すべてのノードの時間取っ SELECTチャンネル、TIME BEGIN_TIME XCP FROM UNION SELECTチャンネル、XCP END_TIME FROM UNION SELECTチャンネル、MIN(BEGIN_TIME)BYチャンネルXCP FROM GROUP UNION SELECTチャンネル、MAX(END_TIME)FROM GROUP BYチャネルXCP)、 TMP2 AS( -ノードが次のノード形成の期間に接続されるたびに SELECT a.channel、a.time、LEAD(a.time 、1)でa.channel ORDER BY OVER(PARTITION .time)NextTime A TMP1)、FROM TMP3 AS( -各期間の中央値をとる SELECT b.channel、b.TIME、b.nexttime、( b.nexttime-b.time)/2+b.timeのmidtime B TMP2 FROM WHERE b.nexttimeではないNULL)、 TMP4(AS -時間の期間の元のレコードの値は、チャネルまたは時間を開放チャネルが開かれていない場合 SELECT Cを* ,. CASEは場合(XCPから1を選択EXISTS O WHERE c.midtime BETWEEN o.begin_time AND THEN o.end_time)1つのELSE 0 END * (c.nexttime-c.time)24 * DURATION TMP3 C FROM) SELECT NVL(d.channel、 '総持続時間')チャネル、d.TIMEは、d.nexttime終了時刻を開始時刻、 SUM(DURATION)「オンタイムチャネル(H)「D TMP4 FROM GROUP BY ROLLUP((d.channel、d.TIME、d.nexttime)) ORDER BY 2。
非常にガベージSQLを見ると、実施計画は、後でクエリのためにそれを記録することを拒否しなければならないこと
原理は、それがあれば、この時間の後とセットに属し、ノードOUTはなく、二つの時間ノード、元のレコードテーブルクエリの中間値との間の時間に時間であり、その後、設定要件に記録及びと
質問2:あなたは長い17を求めているのチャンネルを開きます
-问题2、测试数据-计算27号开放时长(小时) TRUNCATE表XCP。 MI:SS ')、TO_DATE( '20200315午前9時00分00秒'、「YYYYMMDD HH24:MI(XCP値に'13' 、 'A1'、TO_DATE( '20200314午前8時00分00秒'、' YYYYMMDD HH24を挿入:SS')); MI:SS ')、TO_DATE( '20200317午前9時00分00秒'、「YYYYMMDD HH24:MI(XCP値に'14' 、 'A1'、TO_DATE( '20200317午前8時00分00秒'、' YYYYMMDD HH24を挿入:SS')); MI:SS ')、TO_DATE( '20200317午前5時00分00秒'、「YYYYMMDD HH24:MI(XCP値に'15' 、 'A1'、TO_DATE( '20200316午前3時00分00秒'、' YYYYMMDD HH24を挿入:SS')); XCP値への挿入('16' 、 'A1'、TO_DATE( '20200317午前8時00分00秒'、 'YYYYMMDD HH24:MI:SS')、TO_DATE( '20200318午前10時00分○○秒'、「YYYYMMDD HH24:MI :SS')); MI:SS ')、TO_DATE( '20200321午前10時00分00秒'、「YYYYMMDD HH24:MI(XCP値に'18' 、 'A1'、TO_DATE( '20200320 8時○○分00秒'、' YYYYMMDD HH24を挿入:SS')); コミット; BEGIN_TIME BY XCP ORDER SELECT * FROM
----問題2 WITH TMP1 AS( - 17の両方の時点で夜12時17及び24を撮影したノードに参加するのに要する全時間 チャネル選択、TIME BEGIN_TIME XCP FROM UNION SELECTチャネル、XCP END_TIME FROM UNION SELECTチャネル、MIN (BEGIN_TIME)XCP FROM GROUP BYチャネル UNION SELECTチャネル、MAX(END_TIME)XCP FROM GROUP BYチャネル UNION DISTINCTチャンネルを選択し、TO_DATE('20、200317' 、 'YYYYMMDD')XCP FROM UNIONはDISTINCTチャネル、TO_DATEを('20、200318' SELECT、 ' YYYYMMDD「)XCP FROM)、 TMP2 AS( -ノードが次のノード形成の期間に接続されるたびに SELECT a.channel、a.time、LEAD(a.time a.channel ORDER BYのことで、1)OVER(PARTITION a.time)NextTime A TMP1 FROM)、 TMP3 AS( -各期間の中央値取る SELECT b.channelをb.TIME、b.nexttime、( b.nexttime-b.time)/2+b.time midtime TMP2 Bから b.nexttime NOT NULL IS とTO_CHAR(b.TIME「YYYYMMDD」)= 20200317)、 TMP4 ASが( -一定期間チャネルまたはチャネル開設時の元のレコードの値が開かれていない場合は SELECT C *。 、 ケース(FROM。1 SELECT O XCP o.begin_time AND o.end_time BETWEEN c.midtime)THEN END * 0 1 ELSE存在する場合 (c.nexttime-c.time)24 * DURATION TMP3 C)FROM SELECT NVL(D.はチャネル、 '総持続時間')チャネルは、d.TIMEは、d.nexttime終了時刻を開始時刻、 SUM(DURATION) "オン時間経過(時間)" D TMP4 FROM GROUP BY ROLLUP((d.channel、d.TIME、D .nexttime)) 2 BY ORDER。
アイデアは時に別々に添加時点の最初のステップに17ポイントの夜12時24分時点を取ることです
最適化:
コード5つのフルテーブルスキャン、ごみ効率、小さな強い第八の場合とは反対の考慮、アイデアに結合する小さな強い、フルテーブルスキャンを調整する能力、次のように
-特徴8:録画開始時刻記録部の終了時間よりも大きく、その後、時間のこの部分を下に入れて、最終的に失うこと WITH tmpのAS( SELECT a.channel、a.begin_time、a.end_timeを、 (LEAD(a.begin_time、1)OVER BEGIN_TIME BY a.channel ORDER BY(PARTITION、END_TIME) - a.end_time)* 24 hoursto_next_begin_time - それが正である場合、次のレコードの時間間隔はケース8 XCP Aから) SELECT(MAX(END_TIME)-MIN(BEGIN_TIME))* 24 - SUM(DECODE(サイン(hoursto_next_begin_time),. 1、hoursto_next_begin_time、0))チャンネル開口時間 TMP AA FROM