PL/SQL 数据排序问题,大神请帮忙啊~~~

baidu_28714753 2015-06-03 04:53:26
示例:现有数据如下
字段1 字段2 字段3 字段4
A B Y 1
A B W 2
A B W 3
A B S 4
现在新增一字段5,以字段1、字段2分组,字段3排序所得的序列号,
实现方式:DENSE_RANK() OVER(PARTITION BY 字段1,字段2 ORDER BY 字段3
得到如下:
字段1 字段2 字段3 字段4 字段5
A B Y 1 3
A B W 2 2
A B W 3 2
A B S 4 1
但是,我实际想得到的数据是:字段5也要以字段4的顺序一致
字段1 字段2 字段3 字段4 字段5
A B Y 1 1
A B W 2 2
A B W 3 2
A B S 4 3

不知有什么方法可以简单实现?求指导啊~~~
...全文
252 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼W 2015-06-04
  • 打赏
  • 举报
回复
SELECT T.*, DENSE_RANK() OVER(PARTITION BY 字段1, 字段2 ORDER BY 字段4 - LEVEL) 字段5 FROM TAB T START WITH NOT EXISTS (SELECT 1 FROM TAB X WHERE X.字段1 = T.字段1 AND X.字段2 = T.字段2 AND X.字段3 = T.字段3 AND X.字段4 = T.字段4 - 1) CONNECT BY T.字段1 = PRIOR T.字段1 AND T.字段2 = PRIOR T.字段2 AND T.字段3 = PRIOR T.字段3 AND T.字段4 = PRIOR T.字段4 + 1
baidu_28714753 2015-06-04
  • 打赏
  • 举报
回复
引用 4 楼 xuguolong55 的回复:
SELECT B.* , DENSE_RANK() OVER ( PARTITION BY COL1,COL2 ORDER BY COL4 ) as INDEX_RC FROM TEM_TABLE B
你的SQL执行下来,结果如下: 字段1 字段2 字段3 字段4 字段5 A B Y 1 1 A B W 2 2 A B W 3 3 A B S 4 4 A B S 5 5 A B Y 6 6 并不是我要的结果啊。
baidu_28714753 2015-06-04
  • 打赏
  • 举报
回复
引用 6 楼 wildwave 的回复:
。。。貌似Y已经给出先例了。如果字段4不连续,则不排到一起?
对的,若对于字段3而言字段4不联续,如Y,则不排在一起, 想要的结果: 字段1 字段2 字段3 字段4 字段5 A B Y 1 1 A B W 2 2 A B W 3 2 A B S 4 3 A B S 5 3 A B Y 6 4 想了一下午没想到好办法,郁闷
小灰狼W 2015-06-04
  • 打赏
  • 举报
回复
SELECT T.*, DENSE_RANK() OVER(PARTITION BY 字段1, 字段2,字段4 - LEVEL ORDER BY 字段4) 字段5 FROM TAB T START WITH NOT EXISTS (SELECT 1 FROM TAB X WHERE X.字段1 = T.字段1 AND X.字段2 = T.字段2 AND X.字段3 = T.字段3 AND X.字段4 = T.字段4 - 1) CONNECT BY T.字段1 = PRIOR T.字段1 AND T.字段2 = PRIOR T.字段2 AND T.字段3 = PRIOR T.字段3 AND T.字段4 = PRIOR T.字段4 + 1
baidu_28714753 2015-06-04
  • 打赏
  • 举报
回复
引用 6 楼 wildwave 的回复:
。。。貌似Y已经给出先例了。如果字段4不连续,则不排到一起?
若想要的结果是: 字段1 字段2 字段3 字段4 字段5 A B Y 1 1 A B W 2 1 A B W 3 2 A B S 4 1 A B S 5 2 A B Y 6 1 这是又该怎样写SQL呢?真是复杂啊~
baidu_28714753 2015-06-04
  • 打赏
  • 举报
回复
引用 9 楼 wildwave 的回复:
SELECT T.*, DENSE_RANK() OVER(PARTITION BY 字段1, 字段2 ORDER BY 字段4 - LEVEL) 字段5 FROM TAB T START WITH NOT EXISTS (SELECT 1 FROM TAB X WHERE X.字段1 = T.字段1 AND X.字段2 = T.字段2 AND X.字段3 = T.字段3 AND X.字段4 = T.字段4 - 1) CONNECT BY T.字段1 = PRIOR T.字段1 AND T.字段2 = PRIOR T.字段2 AND T.字段3 = PRIOR T.字段3 AND T.字段4 = PRIOR T.字段4 + 1
先拜谢了~第一次接触PL/SQL的递归用法,还不熟练,而且还要考虑性能问题,不知道该怎么优化呢~ 还是要努力学习啊,不管怎样谢谢~
小灰狼W 2015-06-03
  • 打赏
  • 举报
回复
。。。貌似Y已经给出先例了。如果字段4不连续,则不排到一起?
小灰狼W 2015-06-03
  • 打赏
  • 举报
回复
如果例子中字段3为W的 字段四 并不连续,一个为2,一个为5,那该怎么办 字段1 字段2 字段3 字段4 A B Y 1 A B W 2 A B S 3 A B S 4 A B W 5 A B Y 6
  • 打赏
  • 举报
回复
SELECT B.* , DENSE_RANK() OVER ( PARTITION BY COL1,COL2 ORDER BY COL4 ) as INDEX_RC FROM TEM_TABLE B
baidu_28714753 2015-06-03
  • 打赏
  • 举报
回复
引用 1 楼 wildwave 的回复:
不懂。你想要的结果,那么要根据字段4排序,还是字段3?这里有矛盾
见楼上,不知你有啥好方法没有啊~急啊~
baidu_28714753 2015-06-03
  • 打赏
  • 举报
回复
现在我也不知道若要实现我想要的顺序,该以哪个字段排序了。 若再加两条数据, 字段1 字段2 字段3 字段4 A B Y 1 A B W 2 A B W 3 A B S 4 A B S 5 A B Y 6 我实际想得到的数据是: 字段1 字段2 字段3 字段4 字段5 A B Y 1 1 A B W 2 2 A B W 3 2 A B S 4 3 A B S 5 3 A B Y 6 4 到底该怎会有才能实现呢?有什么好的方法没有啊~
小灰狼W 2015-06-03
  • 打赏
  • 举报
回复
不懂。你想要的结果,那么要根据字段4排序,还是字段3?这里有矛盾

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧