2017-04-12 81 views
1

所以我對甲骨文這兩個表:甲骨文雙重選擇問題

CLIENT

cl_id cl_name 
1  John 
2  Maria 

付款

pa_id pa_date  pa_status cl_id 
1  2017-01-01  1   1 
2  2017-01-01  1   2 
3  2017-02-01  1   1 
4  2017-02-01  1   2 
5  2017-03-01  0   1 
6  2017-03-01  1   2 

我需要一個選擇衆所周知聲明,讓我的客戶ID,姓名和他的最後付款的狀態。所以,我選擇的最終結果應該是:

cl_id cl_name pa_status 
1  John  0 
2  Maria 1 

這是客戶選擇的作品:

select cl_id, cl_name from CLIENT;

就是付款選擇工作的最後狀態:

select * from ( select pa_status from PAYMENT ORDER BY PA_DATE DESC) where rownum = 1;

所以現在,我需要讓他們一起工作。我試過2種方法沒有奏效:

select cl_id, cl_name, (select * from ( select pa_status from PAYMENT ORDER BY PA_DATE DESC) where rownum = 1 and PAYMENT.cl_id = CLIENT.CL_ID) as last_status from CLIENT;

錯誤:無效的標識符

這:

select cl_id, cl_name, (select * from ( select pa_status from PAYMENT ORDER BY PA_DATE DESC) where rownum = 1) as last_status from CLIENT;

不給我任何錯誤,但只顯示約翰的最後一個狀態,即最後一條記錄:

cl_id cl_name last_status 
1  John  0 
2  Maria 0 

任何人都可以給我一個提示嗎?

感謝

回答

1

您需要使用分析功能。 這種功能可以讓你將數據分割成一些組,並按照你的意願對每個組的數據進行排名。

你的情況:

Select * from (
Select id, name, status, row_number() over (partition by  p.cl_id order by p.pa_date desc) as rw 
From client c join payments p on p.cl_id = c.cl_id) 
Inn where inn.rw = 1; 
+0

這工作很好的傢伙。謝謝! – Sambarilove

+0

太好了。還有更好的語法 - 尋找FIRST分析函數。祝你好運! – user2671057

0

這得到了客戶 最大日期,然後獲得最高支付編號與日期。

with max_date as (
     select max(date) as max_date, cl_id from payments group by cl_id 
) 
select c.cl_id, c.cl_name, p.pa_sttus from client c 
join payments p 
on c.cl_id = p.cl_id 
where p.pa_id = (select max(p2.pa_id) from payments p2 
        join max_date md 
        on p2.cl_id = md.cl_id 
        where p.cl_id = p2.cl_id 
        and p2.pa_date = md.max_date 
       ) 
+0

這給了我最後一行無效的標識符:「md.pa_date」 – Sambarilove

+0

我使用了錯誤的列名。應該現在工作。 – gorrilla10101

0

先取日期的最大距離爲每個客戶端ID。

Select cl_id, max(pa_date) as pa_date from PAYMENTS group by cl_id 

現在你把烏爾客戶端表,並與上述子查詢加入

select c.cl_id, c.cl_name, 
(select pa_status from PAYMENT t where t.pa_date=p.pa_date and t.cl_id=p.cl_id) 
from CLIENT c join (Select cl_id, max(pa_date) as pa_date from PAYMENTS group by cl_id) p on p.cl_id=c.cl_id 
0

您可以使用Oracle的KEEP LAST這裏:

select cl_id, c.cl_name, last_payment.status 
from client 
join 
(
    select 
    cl_id, 
    max(pa_status) keep (dense_rank last order by pa_date) as status 
    from payments 
    group by cl_id 
) last_payment using (cl_id); 

(如果要包括但不付款的客戶,變化加入到LEFT OUTER JOIN。)