oracle中数据的交集

时间:2015-06-22 15:07:29

标签: oracle oracle11g combinations slice intersection

我在表中有两列。一个表示工作,另一个表示需要执行的日期。我需要输出作为最小可能组合。对于以下记录,我期望在16和17日输出为W1,W2,W3。和W4,W5在20日。无论如何要在查询中实现这一点吗?

W1  15-06-2015
W1  16-06-2015
W1  17-06-2015
W2  16-06-2015
W2  17-06-2015
W2  18-06-2015
W3  16-06-2015
W3  17-06-2015
W4  20-06-2015
W4  21-06-2015
W5  20-06-2015

2 个答案:

答案 0 :(得分:0)

select Date, wm_concat(work) work_concat from table group by Date 

然后你可以按长度排序(work_concat),如果它能为你提供你想要的输出。从我可以收集到的,你想要最大的交叉工作,正确吗?

但是,如果您想获得最大交叉点而没有其他记录,则可以这样做:

    select to_char(work_concat), dateFieldb from (

select rank() over (partition by work order by length(work_concat) desc) rn, c.* from (
select dateFieldb, work_Concat, a.work from work a
inner join (
select DateField dateFieldb, wm_concat(work) work_concat from work a group by DateField
  ) b on b.work_concat like ('%' || a.work || '%')
  ) c

) where rn = 1
group by to_char(work_concat), dateFieldb


TO_CHAR(WORK_CONCAT)  DATEFIELDB
--------------------------------
W1,W3,W2              16-JUN-15  
W1,W3,W2              17-JUN-15  
W4,W5                 20-JUN-15 

答案 1 :(得分:0)

在Oracle 11g中,使用函数listagg()两次:

SQLFiddle demo

select listagg(wdate, ', ') within group (order by works) dates, works
  from (
    select wdate, listagg(wid, ', ') within group (order by wid) works
      from data group by wdate)
  group by works;

...或者如果您只对包含多个共同值的组合感兴趣:

select dates, works from (
    select listagg(wdate, ', ') within group (order by works) dates, works, 
        cnt1, count(1) cnt2
      from (
        select wdate, listagg(wid, ', ') within group (order by wid) works,
            count(1) cnt1
          from data group by wdate)
      group by works, cnt1)
  where cnt1 >1 or cnt2>1