我在表中有两列。一个表示工作,另一个表示需要执行的日期。我需要输出作为最小可能组合。对于以下记录,我期望在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
答案 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()
两次:
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