2017-02-13 11 views
0

このサブクエリを改善して、次の計算に基づいて1つのレコードのみを取得できるように助言してもらえますか? :複数のレコードが同じ日付に見つかった場合に値を選択する方法

PERCENT ¦ LOG_DATE ¦ APP ¦ REQ_ID 
55 ¦ 2017-02-07 15:44:22 ¦ HUO ¦ 253333 
63 ¦ 2017-02-08 10:42:18 ¦ CQS ¦ 265265 
75 ¦ 2017-02-08 06:55:12 ¦ CQS ¦ 265265 
84 ¦ 2017-02-09 08:35:42 ¦ CQS ¦ 265265 
40 ¦ 2017-02-09 09:45:14 ¦ PLK ¦ 277777 

私は、日付ごとに最新の日付(al.AU_TIME)を有する結果、内のレコードだけを見たいのですが。目標は「63」のパーセント値を持つレコードに向けて作業することです。クエリは次のようになります。

55 ¦ 2017-02-07 15:44:22 ¦ HUO ¦ 253333 
63 ¦ 2017-02-08 10:42:18 ¦ CQS ¦ 265265 
84 ¦ 2017-02-09 08:35:42 ¦ CQS ¦ 265265 
40 ¦ 2017-02-09 09:45:14 ¦ PLK ¦ 277777 

同じREQ_IDを持つ複数のレコードが同じ日にある場合はどうすればよいですか。

SELECT TO_NUMBER(RTRIM(ap.AP_NEW_VALUE,'%')) as PERCENT, 
    al.AU_TIME as LOG_DATE, 
    req.RQ_USER_03 as APP, 
    req.RQ_REQ_ID as REQ_ID 
FROM AUDIT_PROPERTIES ap, 
    AUDIT_LOG al, 
    REQ 
WHERE al.AU_ACTION_ID = ap.AP_ACTION_ID and 
     req.RQ_REQ_ID = al.AU_ENTITY_ID and 
     req.rq_req_date BETWEEN TO_DATE('05/02/2017','dd/mm/yyyy') AND TO_DATE('20/02/2017','dd/mm/yyyy') and 
     ap.AP_FIELD_NAME = 'RQ_USER_58' 

ありがとうございます。

+1

私は「テーブル」を持っている。あなたのサンプルあなたの本当の質問は何ですか? –

+0

私の貧しい私の英語のために申し訳ありません、上で編集された。 – imi36

答えて

0

を取得するには、タイムスタンプ値で、この内部クエリで結合する必要がありますこれは、単一の集約クエリ(サブクエリなし)で実行できます。 Group by req_idおよびtrunc(log_date)でグループごとに1つのレコードを選択します。 req_idおよびmax(log_date)(各グループ内の内の)が明らかである。次に、(keep (dense_rank...)first/last機能を使用しています。あなたは与えられたreq_idためのまったく同じ日付と第二のダウンタイム()で2つの行を持つことが可能であるならば、ケアのほんの少しを取る必要があります。

ここではそれを行うための一つの方法だ。私はあなたがテストやイラストの目的のためにWITH句に供給されるテストデータを入れて、それは、クエリのない一部です。

with 
    test_data (percent, log_date, app, req_id) as (
     select 55, to_date('2017-02-07 15:44:22', 'yyyy-mm-dd hh24:mi:ss'), 'HUO', 253333 
     from dual union all 
     select 63, to_date('2017-02-08 10:42:18', 'yyyy-mm-dd hh24:mi:ss'), 'CQS', 265265 
     from dual union all 
     select 75, to_date('2017-02-08 06:55:12', 'yyyy-mm-dd hh24:mi:ss'), 'CQS', 265265 
     from dual union all 
     select 84, to_date('2017-02-09 08:35:42', 'yyyy-mm-dd hh24:mi:ss'), 'CQS', 265265 
     from dual union all 
     select 40, to_date('2017-02-09 09:45:14', 'yyyy-mm-dd hh24:mi:ss'), 'PLK', 277777 
     from dual 
    ) 
-- End of test data (not part of the solution). SQL query begins BELOW THIS LINE 
select max(percent) keep (dense_rank last order by log_date)   as percent, 
     max(log_date)             as log_date, 
     max(app)  keep (dense_rank last order by log_date, percent) as app, 
     req_id 
from test_data 
group by req_id, trunc(log_date) 
order by log_date, req_id 
; 

PERCENT LOG_DATE APP REQ_ID 
------- ---------- --- ------- 
    55 2017-02-07 HUO 253333 
    63 2017-02-08 CQS 265265 
    84 2017-02-09 CQS 265265 
    40 2017-02-09 PLK 277777 

4 rows selected. 
0

これを実行する典型的な方法は、row_number()を使用します。私はあなたのケースで推測できるようベストを:

select a.* 
from (select a.*, 
      row_number() over (partition by req_id order by log_date desc) as seqnum 
     from atable a 
    ) a 
where seqnum = 1; 
+0

*の説明では、提供されたテストデータと望ましい結果は、OPが 'req_id 'と共に' trunc(log_date) 'を' partition by'の一部にしたかったことを示唆しています。 – mathguy

0

あなたは、内側のクエリを書くか、そのちょうど日付別のグループのデータを中間テーブルを作成することによって、これを行うと、各日付 見えるインナークエリのMAX_TIMEを計算することができますこのように:

SELECT cast(al.AU_TIME as date) as LOG_DATE, 
max(al.AU_TIME) as max_LOG_TIME 
FROM AUDIT_PROPERTIES ap, 
    AUDIT_LOG al, 
    REQ 
WHERE al.AU_ACTION_ID = ap.AP_ACTION_ID and 
     req.RQ_REQ_ID = al.AU_ENTITY_ID and 
     req.rq_req_date BETWEEN TO_DATE('05/02/2017','dd/mm/yyyy') AND TO_DATE('20/02/2017','dd/mm/yyyy') and 
     ap.AP_FIELD_NAME = 'RQ_USER_58' 
GROUP BY LOG_DATE 

その後、外側のクエリは、単にそれらのレコード

Select TO_NUMBER(RTRIM(ap.AP_NEW_VALUE,'%')) as PERCENT, 
     al.AU_TIME, 
     req.RQ_USER_03 as APP, 
    req.RQ_REQ_ID as REQ_ID 
    FROM AUDIT_PROPERTIES ap 
    inner join (
SELECT cast(al.AU_TIME as date) as LOG_DATE, 
max(al.AU_TIME) as max_LOG_TIME 
FROM AUDIT_PROPERTIES ap, 
    AUDIT_LOG al, 
    REQ 
WHERE al.AU_ACTION_ID = ap.AP_ACTION_ID and 
     req.RQ_REQ_ID = al.AU_ENTITY_ID and 
     req.rq_req_date BETWEEN TO_DATE('05/02/2017','dd/mm/yyyy') AND TO_DATE('20/02/2017','dd/mm/yyyy') and 
     ap.AP_FIELD_NAME = 'RQ_USER_58' 
GROUP BY LOG_DATE) 
AS X 
ON ap.AU_TIME= X.max_LOG_TIME 
INNER JOIN AUDIT_LOG al 
on al.AU_ACTION_ID = ap.AP_ACTION_ID 
INNER JOIN REQ 
ON req.RQ_REQ_ID = al.AU_ENTITY_ID 
WHERE req.rq_req_date BETWEEN TO_DATE('05/02/2017','dd/mm/yyyy') AND TO_DATE('20/02/2017','dd/mm/yyyy') and 
     ap.AP_FIELD_NAME = 'RQ_USER_58' 
関連する問題