2017-07-17 16 views
0

カラム値、ID、h(階層)と日付カラムを持つテーブルがあります。そのスナップショットは、次のようになりますテーブルからの条件選択Oracle SQL

value | id | h | date 
--- |--- |--- |------------ 
1.0 | 32 | 0 | Jul 3, 2017 
5.6 | 54 | 1 | Jul 2, 2017 
3.5 | 178 | 2 | Jul 3, 2017 
3.4 | 178 | 2 | Jul 1, 2017 

この表は主キー(別名各値について複数のレコードが存在する、ID、時間、または日)を有していません。 idとhは1対1の関係を持っています。

今日が7月3日であると仮定して、今日の各idの値をhで順番に返し、そのidの今日のレコードがない場合はnull値を示すようにクエリを書きたいと思います。役立つかもしれない参加別名左をやって、この

value | id | h 
--- |--- |--- 
1.0 | 32 | 0 
null | 54 | 1 
3.5 | 178 | 2 
+3

あなたが '7月の3rd'値のすべてを見たい場合は、理由です'7月2日 'の値が目的の結果セットにありますか? – Siyual

+0

7月3日の値のすべてに加えて、私は今日利用可能な値を持たない他のIDも見たいと思っています。私はそのID 54のヌルを示していて、7月2日の値は表示していません。 – Deb

+0

2017年7月1日の行はどうですか?値が 'null'の結果セットに含まれていないのはなぜですか? –

答えて

1

は次のように: -

Select b.value,a.id,a.h 
from 
(Select distinct id,h 
from <table>) a 
left join 
(Select id,h,value 
from <table> where date > trunc(SYSDATE)) b 
on a.id = b.id 
and a.h = b.h; 
+0

私は前に左の結合を使用していた、それは私に左の背面に全体のテーブルを与えていない。あなたの答えを見て、私は最後にではなく、カッコ内にすべての条件を入れなければならないことに気付きました。これが解決していただきありがとうございます! – Deb

+0

その場合は、この質問に回答してください。 – Max08

0

をあなたが最初の列にCASE文を使用して、条件付きIF-ELSEロジックを実装することができます

select 
     // if current date is the same as date in date_col output value 
    case when sysdate - date_col < 1 then value 
     // else output null 
    else null end "value", 
    id, h 
    from my_table 
    order by 3; // sort by h column 
0

解析関数を使用して、ケースステートメント、あなたは結果を達成することができます。その列hはここで、負の値を持つことになることはありませんと仮定すると、クエリです:

SQL> WITH cte_sample(value,id,h,D) AS (
    2 SELECT 1.0, 32, 0, to_date('Jul 18, 2017', 'Mon DD, YYYY') FROM dual UNION ALL 
    3 SELECT 5.6, 54, 1, to_date('Jul 17, 2017', 'Mon DD, YYYY') FROM dual UNION ALL 
    4 SELECT 3.5, 178, 2, to_date('Jul 18, 2017', 'Mon DD, YYYY') FROM dual UNION ALL 
    5 SELECT 3.4, 178, 2, to_date('Jul 16, 2017', 'Mon DD, YYYY') FROM dual UNION ALL 
    6 SELECT 3.6, 178, 3, to_date('Jul 18, 2017', 'Mon DD, YYYY') FROM dual), 
    7 ---------------------- 
    8 -- End of data 
    9 ---------------------- 
10 extracted_table AS (
11 SELECT CASE WHEN d = trunc(sysdate) THEN VALUE ELSE NULL END AS VALUE, 
12   ID, 
13   h, 
14   d, 
15   row_number() OVER(PARTITION BY ID ORDER BY CASE WHEN d = trunc(SYSDATE) THEN -9 ELSE h END) rn 
16 FROM cte_sample) 
17 SELECT VALUE, ID, h FROM extracted_table WHERE rn = 1; 

出力:

 VALUE   ID   H 
---------- ---------- ---------- 
     1   32   0 
        54   1 
     3.5  178   2 
関連する問題