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

关于数据重复问题

[复制链接]
论坛徽章:
2
2012新春纪念徽章
日期:2012-01-04 11:50:44优秀写手
日期:2014-07-01 06:00:12
11#
 楼主| 发表于 2017-3-8 09:05 | 只看该作者
本帖最后由 DAWN_WU 于 2017-3-8 09:07 编辑
newkid 发表于 2017-3-6 23:39
关于留下哪一条,规则是什么?凭什么留下的不是B A?
如果目前已经有查询就贴出来,有了规则稍微改一下就 ...

同一组数据中,选取start_no < start_no_2的那一组数据留下来。

select *
  from table_label a, table_label b
where a.goods_group = b.goods_group
   and ((a.start_no <= b.start_no and a.end_no >= b.start_no) or
       (a.start_no <= b.end_no and a.end_no >= b.end_no))
   and a.goods_code || '-' || A.LOT_NO || '-' || A.LABEL_CODE <>
       B.goods_code || '-' || B.LOT_NO || '-' || B.LABEL_CODE

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
12#
发表于 2017-3-8 10:22 | 只看该作者
DAWN_WU 发表于 2017-3-8 09:03
如果一组数据是重复的,留start_no < start_no_2的那一组

你说的是“如果一组数据是重复的,留start_no < start_no_2的那一组”, 但是你目前给的结果不是这样的, 那你看看黄色的结果, 有些是start_no > start_no_2,  因此你的需求和你要的结果是不一致的, 你要先给出确定的

使用道具 举报

回复
论坛徽章:
2
2012新春纪念徽章
日期:2012-01-04 11:50:44优秀写手
日期:2014-07-01 06:00:12
13#
 楼主| 发表于 2017-3-16 14:34 | 只看该作者
bell6248 发表于 2017-3-8 10:22
你说的是“如果一组数据是重复的,留start_no < start_no_2的那一组”, 但是你目前给的结果不是这样的, ...

确实给出的答案不正确,在1楼重新更新了问题描述。

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
14#
发表于 2017-3-16 16:46 | 只看该作者
DAWN_WU 发表于 2017-3-16 14:34
确实给出的答案不正确,在1楼重新更新了问题描述。




其实之前的代码只要做很小的改动即可, 代码测试如下:

SQL> select GOODS_GROUP1,
  2         GOODS_CODE1,
  3         LABEL_CODE1,
  4         LOT_NO1,
  5         START_NO1,
  6         END_NO1,
  7         GOODS_GROUP2,
  8         GOODS_CODE2,
  9         LABEL_CODE2,
10         LOT_NO2,
11         START_NO2,
12         END_NO2
13  from
14  (
15  select a.GOODS_GROUP GOODS_GROUP1,
16         a.GOODS_CODE GOODS_CODE1,
17         a.LABEL_CODE LABEL_CODE1,
18         a.LOT_NO LOT_NO1,
19         a.START_NO START_NO1,
20         a.END_NO END_NO1,
21         b.GOODS_GROUP GOODS_GROUP2,
22         b.GOODS_CODE GOODS_CODE2,
23         b.LABEL_CODE LABEL_CODE2,
24         b.LOT_NO LOT_NO2,
25         b.START_NO START_NO2,
26         b.END_NO END_NO2,
27         row_number() over(partition by a.GOODS_GROUP, least(a.LABEL_CODE || a.LOT_NO, b.LABEL_CODE || b.LOT_NO), greatest(a.LABEL_CODE || a.LOT_NO, b.LABEL_CODE || b.LOT_NO) order by a.START_NO) rn
28    from table_label a,
29         table_label b
30   where a.goods_group = b.goods_group
31     and ((a.start_no <= b.start_no and a.end_no >= b.start_no) or (a.start_no <= b.end_no and a.end_no >= b.end_no))
32     and a.goods_code || '-' || A.LOT_NO || '-' || A.LABEL_CODE <> B.goods_code || '-' || B.LOT_NO || '-' || B.LABEL_CODE
33  )
34  where rn = 1;

GOODS_GROUP1 GOODS_CODE1 LABEL_CODE1 LOT_NO1   START_NO1    END_NO1 GOODS_GROUP2 GOODS_CODE2 LABEL_CODE2 LOT_NO2   START_NO2    END_NO2
------------ ----------- ----------- -------- ---------- ---------- ------------ ----------- ----------- -------- ---------- ----------
A            G1          L1          J1              101        250 A            G2          L1          J2              180        300
A            G2          L1          J2              180        300 A            G2          L2          J2              300        310
B            G6          L4          J6              211        290 B            G7          L4          J7              280        360
C            G8          L6          J9               85        210 C            G8          L5          J8              101        250
C            G8          L5          J8              101        250 C            G8          L7          J9              200        300
C            G8          L6          J9               85        210 C            G8          L7          J9              200        300

6 rows selected

SQL>



使用道具 举报

回复
论坛徽章:
2
2012新春纪念徽章
日期:2012-01-04 11:50:44优秀写手
日期:2014-07-01 06:00:12
15#
 楼主| 发表于 2017-3-24 09:41 | 只看该作者
bell6248 发表于 2017-3-16 16:46
其实之前的代码只要做很小的改动即可, 代码测试如下:

SQL> select GOODS_GROUP1,

谢谢!

               row_number() over(partition by a.GOODS_GROUP, least(a.LABEL_CODE || a.LOT_NO, b.LABEL_CODE || b.LOT_NO), greatest(a.LABEL_CODE || a.LOT_NO, b.LABEL_CODE || b.LOT_NO) order by a.START_NO, a.END_NO) rn


这个函数,没看明白为什么这样写,想请教下你怎么考虑的~~

使用道具 举报

回复

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

本版积分规则 发表回复

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