2017-07-17 76 views
0

我有一个包含列值,标识,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,H,或日期的多条记录)。 id和h有一对一的关系。

我想编写一个查询,以便假设今天是7月3日,它将为今天的每个id返回一个值,按h排序,如果没有该id的今天记录,则显示空值。又名这样

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

如果你想看到所有的'七月3rd'值的,为什么是'7月2日'值出现在所需的结果集中? – Siyual

+0

除了所有7月3日的价值之外,我还想看看今天没有可用价值的其他ID是什么。我为该ID显示为空54,并没有显示7月2日的价值。 – Deb

+0

2017年7月1日这一行怎么样?为什么它不在结果集中,值为空值? –

回答

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

使用分析功能,和case语句,你可以达到结果。假设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