2017-02-13 58 views
0

我有名稱和白天列,所以同一個名稱可能有多個日期, 在預先確定的時間從prevoius白天提取數據的oracle中的查詢是什麼,例如:在oracle中查詢以從特定時間提取prevoius白天的數據

name daytime 
t12 12-Mar-2016 
t12 14-Aug-2016 
t34 13-Jan-2005 
t34 18-Mar-2005 

,我需要:

name daytime 
t12 12-Mar-2016 
t34 13-Jan-2005 

感謝, 小號

+1

我很想用min(日期)。請澄清,如果這不是你所需要的。 – GurV

+0

我不能使用min(日期),因爲我需要某個日期前的日期,因爲可以是「t12 11-jan-2016」,但我需要「t12 12-Mar-2016」。 –

+2

請添加更多數據來清除這一點。 「之前」是什麼意思? – GurV

回答

0

你可以使用分鐘第二組由

select name, min(daytime) 
from my_table 
group by name 
0

的一種方法是使用解析函數row_number()(或也許有其近親,或者rank()dense_rank(),這取決於需要。如果沒有「關係」,則它們都會產生相同的輸出,這意味着您不能有兩行具有相同的name相同的daytime)。

這是更經常使用與rn = 1得到最大daytime;如果您要使用最新的「第二個」daytime,請使用rn = 2

內部查詢爲輸入表中的每一行返回一行 - 在每行和每列中具有相同的列和值,並且添加了一列,rn,顯示其組中每行的「排名」與namepartition by中的列)相同的行,由daytimedesc結尾排序。那麼它應該是顯而易見的外部查詢。

with 
    test_data (name, daytime) as ( 
     select 't12', to_date('12-Mar-2016', 'dd-Mon-yyyy') from dual union all 
     select 't12', to_date('14-Aug-2016', 'dd-Mon-yyyy') from dual union all 
     select 't34', to_date('13-Jan-2005', 'dd-Mon-yyyy') from dual union all 
     select 't34', to_date('18-Mar-2005', 'dd-Mon-yyyy') from dual 
    ) 
-- End of test data (not part of the solution). SQL query begins BELOW THIS LINE 
select name, daytime 
from (
     select name, daytime, 
       row_number() over (partition by name order by daytime desc) as rn 
     from test_data 
     ) 
where rn = 2 
; 

NAME DAYTIME 
---- ----------- 
t12 12-Mar-2016 
t34 13-Jan-2005 

2 rows selected. 
0

我不知道我是否理解這個問題,但可能要使用LAG。這會給你任何給定日期之前的日期,假設沒有重複。借用mathguy的測試數據CTE,我嘗試過:

with 
    test_data (name, daytime) as ( 
     select 't12', to_date('12-Mar-2016', 'dd-Mon-yyyy') from dual union all 
     select 't12', to_date('14-Aug-2016', 'dd-Mon-yyyy') from dual union all 
     select 't34', to_date('13-Jan-2005', 'dd-Mon-yyyy') from dual union all 
     select 't34', to_date('18-Mar-2005', 'dd-Mon-yyyy') from dual 
    ) 
-- End of test data (not part of the solution). SQL query begins BELOW THIS LINE 
select * from 
(
select name, lag(daytime) over(partition by name order by daytime) daytime 
from test_data 
) 
where daytime is not null