簡體   English   中英

如何遍歷嵌套Oracle SQL查詢中選擇的記錄並根據特定條件在外部選擇中選擇它們

[英]How to iterate thru records selected in nested Oracle SQL query and select them in outer select based on certain condition

嗨,我陷入了一個問題:

現在,我有一堆嵌套的select語句,這些語句為我提供了一組記錄:

1. KEY_ID       SEQ_DATETTIME   ETR_DATETIME 
2. 2002707959   ETR_SEQ_1       08/28/2019 19:15:00 
3. 2002707959   ETR_SEQ_2       08/28/2019 23:30:00
4. 2002707959   ETR_SEQ_3       08/28/2019 23:45:00
5. 2002707959   ETR_SEQ_4       08/29/2019 00:00:00
6. 2002707959   ETR_SEQ_5       08/29/2019 00:15:00
7. 2002707959   ETR_SEQ_6       08/29/2019 01:00:00

在我的下一個外部select語句中,我希望能夠始終保留ETR_SEQ_1。 如果不是'ETR_SEQ_1',那么我必須檢查ETR_DATETIME是否比上一個值(ETR_DATETIME-lag(ETR_DATETIME))大60分鍾。如果大於60,則我想保留它,如果小於60,那么我就不想保留它。我需要遍歷此過程,直到到達具有該KEY_ID的最后一條記錄為止

因此,這將是數據:

1. KEY_ID   SEQ_DATETTIME   ETR_DATETIME         
2. 2002707959   ETR_SEQ_1   08/28/2019 19:15:00
3. 2002707959   ETR_SEQ_2   08/28/2019 23:30:00
4. 2002707959   ETR_SEQ_3   08/28/2019 23:45:00
5. 2002707959   ETR_SEQ_4   08/29/2019 00:00:00
6. 2002707959   ETR_SEQ_5   08/29/2019 00:15:00
7. 2002707959   ETR_SEQ_6   08/29/2019 01:00:00

這將是下一個外部select語句的結果:

1. KEY_ID   SEQ_DATETTIME   ETR_DATETIME         
2. 2002707959   ETR_SEQ_1   08/28/2019 19:15:00
3. 2002707959   ETR_SEQ_2   08/28/2019 23:30:00
4. 2002707959   ETR_SEQ_6   08/29/2019 01:00:00

(每個key_id並不總是6條記錄,可以更多也可以更少,並且還有其他key_id記錄)

然后,我繼續在外部select語句中使用數據。

請幫助我不知道如何通過此迭代。 謝謝。

嘗試這個

Select * from (SELECT T.*, 
Case when (ETR_DATETIME - lag(ETR_DATETIME) over (partition by key_id order by ETR_DATETIME) * 1440 > 60 
then 1 
else 0 end as diff
From (your_inner_query) t where t.status = 'KEEP')
Where SEQ_DATETTIME = 'ETR_SEQ_1' or NVL(diff,1) = 1

干杯!!

我必須檢查ETR_DATETIME是否比上一個值(ETR_DATETIME-lag(ETR_DATETIME))大60分鍾。如果大於60,那么我要保留它;如果小於60,則我不保留它。不想保留它。

您要使用lag() ,如下所示:

select t.*
From (select t.*,
             lag(ETR_DATETIME) over (partition by key_id order by ETR_DATETIME) as prev_edt
      from t
     ) t
where prev_edt is null or prev_edt < etr_datetime - interval '60' minute

考慮此表:

1. KEY_ID       SEQ_DATETTIME   ETR_DATETIME         VIR_TS              STATUS  
2. 2002707959   ETR_SEQ_1       08/28/2019 19:15:00  08/28/2019 19:15:00 KEEP 
3. 2002707959   ETR_SEQ_2       08/28/2019 23:30:00  08/28/2019 19:15:00 KEEP
4. 2002707959   ETR_SEQ_3       08/28/2019 23:45:00  08/28/2019 19:15:00 DROP
5. 2002707959   ETR_SEQ_4       08/29/2019 00:00:00  08/28/2019 19:15:00 DROP
6. 2002707959   ETR_SEQ_5       08/29/2019 00:15:00  08/28/2019 19:15:00 DROP
7. 2002707959   ETR_SEQ_6       08/29/2019 01:00:00  08/29/2019 01:00:00 KEEP

在這里,您只需要與VIR_TS列進行比較,對嗎?
訣竅是生成VIR_TS列,然后在該列上使用LAG()作為Tajash的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM