2014-01-16 66 views
1

我的表包含類似下面的每一列分頁要求,的Oracle SQL選擇多列在一個查詢不同的值基於不同的價值

CUSTOMER_ID ATTR1 ATTR2


 1 V1_0001 V2_0001 
    2 V1_0001 V2_0001 
    3 V1_0001 V2_0001 
    4 V1_0001 V2_0002 
    5 V1_0001 V2_0003 
    6 V1_0002 V2_0004 
    7 V1_0003 V2_0005 
    8 V1_0004 V2_0005 
    9 V1_0004 V2_0005 
    10 V1_0005 V2_0006 
    .. ....... ....... 
100000 V1_0120 V2_0268 

選擇100000行。

有沒有什麼辦法可以在一個查詢中選擇每列的不同值(不使用按列出的列) - 也沒有使用UNION? Customer_Id不是必需的。

複雜性在於我需要將兩列的不同值限制爲每列100個記錄(第一個)。

換句話說我的結果應該是這樣的,

ATTR1 ATTR2
-------
V1_0001 V2_0001
V1_0002 V2_0002
V1_0003 V2_0003
....... .......
V1_0100 V2_0100

如果該列的不同值不足100,則返回null(或無值)無誤。

這只是我原始查詢的一小部分,我可以管理的其餘部分。 請幫忙。

+0

不使用GROUP BY或者是某種形式的測試任何一點? – Mihai

+0

GROUP BY attr1,attr2給了我一個聯合的分組結果,因爲我需要單獨的DISTINCT attr1,DISTINCT attr2並選擇attr1的前100或更少,並選擇attr2的前100或更少。有時attr1可能只有50個值,但需要決定使用rownum還是rank。 –

回答

0

這樣的要求永遠不會到來,也並不完美,但工作

with tab(ids, v1, v2) as (
select 1,'V1_0001', 'V2_0001' from dual union all 
select 2,'V1_0001', 'V2_0001' from dual union all 
select 3,'V1_0001', 'V2_0001' from dual union all 
select 4,'V1_0001', 'V2_0002' from dual union all 
select 5,'V1_0001', 'V2_0003' from dual union all 
select 6,'V1_0002', 'V2_0004' from dual union all 
select 7,'V1_0003', 'V2_0005' from dual union all 
select 8,'V1_0004', 'V2_0005' from dual union all 
select 9,'V1_0004', 'V2_0005' from dual union all 
select 10,'V1_0005', 'V2_0006' from dual), 
tab2 as (select v11, rownum r1 from 
     (select distinct v1 as v11 from tab) where rownum <= 100), 
tab3 as (select v22, rownum r2 from 
     (select distinct v2 as v22 from tab) where rownum <= 100) 
select v11, v22 
    from tab2 
full outer join tab3 on (r1 = r2) 

輸出:

V11       V22 
---------------------------- ---------------------------- 
V1_0001      V2_0001 
V1_0002      V2_0002 
V1_0003      V2_0003 
V1_0004      V2_0004 
V1_0005      V2_0005 
          V2_0006 
相關問題