2013-02-16 57 views
-4

記錄類似的順序我有這個表:分組維持秩序

day point deltatime order 
8  5  2   1 
8  7  1   2 
8  3  4   3 
8  2  2   4 
9  5  2   1 
9  7  2   2 
9  3  3   3 
9  2  2   4 
5  5  2   1 
5  7  1   2 
5  3  4   3 
5  2  2   4 
3  5  2   1 
3  7  2   2 
3  3  3   3 
3  2  2   4 

我需要一個(有效的)Oracle查詢,以獲得(可能不聲明功能):

dayaggr point deltatime order 
8,5  5  2   1 
8,5  7  1   2 
8,5  3  4   3 
8,5  2  2   4 
9,3  5  2   1 
9,3  7  2   2 
9,3  3  3   3 
9,3  2  2   4 

所以我需要根據相同的記錄序列彙總日子,保持秩序。使用LISTAGG的解決方案是首選。 在此先感謝。

+2

這是不可能破譯:由days desc

小提琴剛剛訂購。請以更具可讀性的格式顯示數據類型等表格模式,樣本行和預期輸出。如果您花費更多的前期時間來構建更好的問題,您將獲得更多幫助。 – OldProgrammer 2013-02-16 20:51:14

回答

2

這樣的:

SQL> select listagg(d.day,',') within group(order by 1) days, point, deltatime, ordr 
    2 from data d 
    3   inner join (select day, listagg(point||':'||deltatime||':'||ordr,',') within group (order by ordr) grp 
    4      from data 
    5      group by day) grp 
    6     on grp.day = d.day 
    7 group by point, deltatime, ordr, grp 
    8 order by days desc, ordr; 

DAYS   POINT DELTATIME  ORDR 
---------- ---------- ---------- ---------- 
5,8     5   2   1 
5,8     7   1   2 
5,8     3   4   3 
5,8     2   2   4 
3,9     5   2   1 
3,9     7   2   2 
3,9     3   3   3 
3,9     2   2   4 

8 rows selected. 

有給你的數據沒有可靠的方法來「維持秩序」如果你指的「天」,所以我http://sqlfiddle.com/#!4/3ea17/2

+0

天的順序並不重要;你的解決方案正在工作,但對於我的真實數據,listagg(point ||':'|| deltatime ||':'|| ordr,',')可能會變得太長(不知道它是否有任何大小限制):在這個例子中,我顯示每組只有4行,但我可以超過100行;進一步我有超過三個字段(point,deltatime,ordr),我可以有10-12個連接。 – ascattolini 2013-02-17 00:35:20

+0

@ user2079010 - 「不知道它是否有任何大小限制」。 LISTAGG()返回varchar2,這是它的限制:返回的值必須<= 4000個字符。 「我可以有10-12個連接」。你的觀點是? – APC 2013-02-17 04:16:15

+0

@ user2079010對於大於4000個字符的字符串,有幾種不同的字符串聚合技術。或者你可以使用不同列的散列。 (這並不總是微不足道的 - 您需要對每列的散列加上列的位置進行散列,這將確保交換的值不會相同。)但是無論如何,這種方法應該可以工作。 – 2013-02-17 05:27:30

0

試試這個:

SELECT 
    LISTAGG(day, ',') WITHIN GROUP (ORDER BY point, deltatime, order) "dayaggr", 
    point, deltatime, order 
    FROM MyTable 
    GROUP BY point, deltatime, order; 
+0

這是行不通的:我得到3,5,8,9時(點,deltatime,order)=(2,2,4)或(5,2,1) – ascattolini 2013-02-17 00:25:35