2013-02-16 61 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