12
返回列表 发新帖
楼主: antipass

wm_concat支持distinct函数去重,listagg怎么对结果去重

[复制链接]
论坛徽章:
27
2014年新春福章
日期:2014-02-18 16:50:09秀才
日期:2015-06-25 15:39:28秀才
日期:2015-06-29 15:26:52秀才
日期:2015-07-03 17:00:53秀才
日期:2015-07-14 09:44:30金牛座
日期:2015-07-21 14:01:36秀才
日期:2015-09-14 10:08:30秀才
日期:2016-02-18 09:24:18秀才
日期:2016-02-18 10:08:02举人
日期:2016-02-24 17:33:17
11#
发表于 2016-10-17 13:31 | 只看该作者
caroline0803 发表于 2016-1-13 11:42
今天我也遇到了该问题:
这个帖子可以解决该问题:
http://stackoverflow.com/questions/11510870/listag ...

如果加上按 col1分组的语句,就有重复值了,这个应该如何解决?
WITH tab AS
(SELECT 1 AS col1, 2 AS col2, 'Smith' AS created_by
    FROM dual
  UNION ALL
  SELECT 1 AS col1, 2 AS col2, 'John' AS created_by
    FROM dual
  UNION ALL
  SELECT 1 AS col1, 3 AS col2, 'Ajay' AS created_by
    FROM dual
  UNION ALL
  SELECT 1 AS col1, 4 AS col2, 'Ram' AS created_by
    FROM dual
  UNION ALL
  SELECT 1 AS col1, 5 AS col2, 'Jack' AS created_by
    FROM dual)
SELECT listagg(col2_with_nulls, ',') within GROUP(ORDER BY col2_with_nulls)  over(partition by col1) col1
  FROM (SELECT col1,
               CASE
                 WHEN lag(col2) over(ORDER BY col2) = col2 THEN
                  NULL
                 ELSE
                  col2
               END AS col2_with_nulls,
               created_by
          FROM tab);

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
12#
发表于 2016-10-17 22:14 | 只看该作者
i2235932666 发表于 2016-10-17 13:31
如果加上按 col1分组的语句,就有重复值了,这个应该如何解决?
WITH tab AS
(SELECT 1 AS col1, 2 AS ...

你想输出什么?OO似乎在另外一贴已经回答了你,就是用GROUP BY不要用分析函数和PARTITION BY。

WITH tab AS
(SELECT 1 AS col1, 2 AS col2, 'Smith' AS created_by
    FROM dual
  UNION ALL
  SELECT 1 AS col1, 2 AS col2, 'John' AS created_by
    FROM dual
  UNION ALL
  SELECT 1 AS col1, 3 AS col2, 'Ajay' AS created_by
    FROM dual
  UNION ALL
  SELECT 1 AS col1, 4 AS col2, 'Ram' AS created_by
    FROM dual
  UNION ALL
  SELECT 1 AS col1, 5 AS col2, 'Jack' AS created_by
    FROM dual)
SELECT listagg(col2_with_nulls, ',') within GROUP(ORDER BY col2_with_nulls)  
  FROM (SELECT col1,
               CASE
                 WHEN lag(col2) over(ORDER BY col2) = col2 THEN
                  NULL
                 ELSE
                  col2
               END AS col2_with_nulls,
               created_by
          FROM tab)
group by col1;

使用道具 举报

回复
论坛徽章:
27
2014年新春福章
日期:2014-02-18 16:50:09秀才
日期:2015-06-25 15:39:28秀才
日期:2015-06-29 15:26:52秀才
日期:2015-07-03 17:00:53秀才
日期:2015-07-14 09:44:30金牛座
日期:2015-07-21 14:01:36秀才
日期:2015-09-14 10:08:30秀才
日期:2016-02-18 09:24:18秀才
日期:2016-02-18 10:08:02举人
日期:2016-02-24 17:33:17
13#
发表于 2016-10-25 16:10 | 只看该作者
newkid 发表于 2016-10-17 22:14
你想输出什么?OO似乎在另外一贴已经回答了你,就是用GROUP BY不要用分析函数和PARTITION BY。

WITH t ...

是的,但加上分析函数listagg的结果就会有重复,这确实是个小瑕疵啊

使用道具 举报

回复
论坛徽章:
15
秀才
日期:2017-01-20 11:00:36秀才
日期:2016-11-25 16:52:36蜘蛛蛋
日期:2011-05-27 16:25:49托尼托尼·乔巴
日期:2018-05-09 11:35:22ITPUB15周年纪念
日期:2016-10-13 13:15:34奥运会纪念徽章:皮划艇激流回旋
日期:2016-09-21 17:33:26奥运会纪念徽章:跳水
日期:2016-09-13 10:47:52优秀写手
日期:2014-08-14 06:00:13咸鸭蛋
日期:2012-12-05 15:47:46ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15
14#
发表于 2016-10-26 14:20 | 只看该作者
i2235932666 发表于 2016-10-17 13:31
如果加上按 col1分组的语句,就有重复值了,这个应该如何解决?
WITH tab AS
(SELECT 1 AS col1, 2 AS ...

2,3,4,5
2,3,4,5
2,3,4,5
2,3,4,5
2,3,4,5
------------------没有重复呀

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表