![](/img/trans.png)
[英]Oracle SQL query to select records based on condition based on returned value
[英]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.