***这个SELECT语句能不能写出来(只要给个建议就给分!!!)

xiaobeibei 2002-06-19 11:59:00
假设有这样一个表.表中有3个字段.
table T_1
A
B
C
写一条SELECT语句.
对表中的记录:按照A降序,按照B升序,按照C降序.
然后根据排序结果生成一个新的字段(序号).
要求ABC都相同的纪录要生成同样的序号.下面的记录序号要累加.
比如下面的结果:
序号 A B C
1 12 1111 1000
1 12 1111 1000
3 10 2222 900
4 9 3333 800
4 9 3333 800
6 8 4444 700
...全文
30 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
biti_rainy 2002-06-20
  • 打赏
  • 举报
回复
8i以前版本不知道视图或者结果集的order by

所以805中是不能这么做的
不过,可以这么试一下:

(select rownum num,a from (select A from T_1 group by A,)) x
ATCG 2002-06-20
  • 打赏
  • 举报
回复
首先我这个办法肯定是可行的,我试过的,ORACLE8.0.5 没有RANK的
至于ORACLE8.0.5在子查询里能不能用ORDER BY 你可以试试看的,
我用的是8.1.7, 8.0.5 我已经好久没用了。
还有括号,你在仔细看看,自己也可以调整一下的。
xiaobeibei 2002-06-20
  • 打赏
  • 举报
回复
ATCG(ATCG) 先谢谢你了.但是确实出错误:
下面出错误:
(select 序号,A from T_1 order by A DESC) x,
***
是ORA-00907错误,好象是说括号不匹配.
我用的是ORACLE8.05,会不会是这个原因呢?
而且好象也不支持RANK的.
51netlife 2002-06-20
  • 打赏
  • 举报
回复
create table TEST
(
A number(5),
B number(5),
C number(5)
)
insert into TEST (A, B, C)
values (12, 1111, 1000);
insert into TEST (A, B, C)
values (9, 3333, 800);
insert into TEST (A, B, C)
values (12, 1111, 1000);
insert into TEST (A, B, C)
values (9, 3333, 800);
insert into TEST (A, B, C)
values (10, 2222, 900);
insert into TEST (A, B, C)
values (8, 4444, 700);
commit;
select rank() over(order by a desc,b asc,c desc ) 序号,a,b,c from test;
ATCG 2002-06-20
  • 打赏
  • 举报
回复
这样试试吧,有点复杂

select m.序号,n.A,n.B,n.C from
((select TO_NUMBER(SUBSTR(to_char((TO_DATE('31-MAY-02') + rownum),'YYYYMMDD'),7,2))
序号 from all_objects where rownum < 11)) m,
(SELECT 'Q' Q,A,B,C FROM (
select distinct A,B,C FROM (
SELECT x.序号,x.A,y.B,z.C from
(select 序号,A from T_1 order by A DESC) x,
(select 序号,B from T_1 order by B) y,
(select 序号,C from T_1 order by C DESC) z
WHERE x.序号=y.序号 AND y.序号=z.序号))) n
where m.序号=n.Q(+)
/
xiaobeibei 2002-06-20
  • 打赏
  • 举报
回复
谢谢楼上的各位,虽然你们给的代码现在仍然不好用.
但我还是要非常的感谢你们.
ATCG 2002-06-20
  • 打赏
  • 举报
回复
也许我的思路并不正确,就当是自己的观点吧,希望大家帮助。谢谢!
ATCG 2002-06-20
  • 打赏
  • 举报
回复
我没有让人折腾,只是提供一些思路,关于ORDER BY 的问题
我已解释过了,更多的是需要小贝贝自己去做现场调整。
biti_rainy 2002-06-20
  • 打赏
  • 举报
回复
老哥,8i以前版本不能在里面写 order by
就别再让人折腾了

我没有805版本
不过你可以如我上面说的利用 group by,看能否解决问题
good luck
ATCG 2002-06-20
  • 打赏
  • 举报
回复
再试试!

SELECT ROWNUM 序号,A,B,C FROM (
select DISTINCT A,B,C FROM (
SELECT x.序号,x.A,y.B,z.C from
(select 序号,A from T_1 order by A DESC) x,
(select 序号,B from T_1 order by B) y,
(select 序号,C from T_1 order by C DESC) z
WHERE x.序号=y.序号 AND y.序号=z.序号))
/
xg_delayth 2002-06-19
  • 打赏
  • 举报
回复
up
xiaobeibei 2002-06-19
  • 打赏
  • 举报
回复
不用SEQUENCE可以吗?
我们客户要求不能随便更改表的.
bzszp 2002-06-19
  • 打赏
  • 举报
回复
create sequence s_country_id increment by 1 start with 1 maxvalue 999999999;
select s_country_id.nextval from dual;
ATCG 2002-06-19
  • 打赏
  • 举报
回复
这样就行了

CREATE SEQUENCE MY_SEG START WITH 1 INCREMENT BY 1
/


SELECT MY_SEG.NEXTVAL,A,B,C FROM (
select distinct A,B,c FROM (
SELECT x.序号,x.A,y.B,z.C from
(select 序号,A from T_1 order by A DESC) x,
(select 序号,B from T_1 order by B) y,
(select 序号,C from T_1 order by C DESC) z
WHERE x.序号=y.序号 AND y.序号=z.序号))
/
xiaobeibei 2002-06-19
  • 打赏
  • 举报
回复
我用的版本是ORACLE 8.05.而且序号不是表中的字段,是要生成的.
能不能先提示我怎么生成一个新的字段.
yalau 2002-06-19
  • 打赏
  • 举报
回复
用oracle 9i olap 可以解决,但不知你在何处用!
ATCG 2002-06-19
  • 打赏
  • 举报
回复
是否可以这样,我还没试过,你自己先试一下吧!

select distinct A||B||c FROM (
SELECT x.序号,x.A,y.B,z.C from
(select 序号,A from T_1 order by A DESC) x,
(select 序号,B from T_1 order by B) y,
(select 序号,C from T_1 order by C DESC) z)
WHERE x.序号=y.序号 AND y.序号= z.序号)
ORDER BY 序号;

得到上面的结果,

GOUSHIJIE 2002-06-19
  • 打赏
  • 举报
回复
有深度,但问题的关键在:相同的纪录要生成同样的序号和生成的新字段的序号之间的对应
ATCG 2002-06-19
  • 打赏
  • 举报
回复
小贝贝;

除了序列不符合你的要求之外,为什么你说我的方法不对呢?我试过的呀。
xiaobeibei 2002-06-19
  • 打赏
  • 举报
回复
这个问题难道真的没有解决方案了吗?
如果简化一下可以吗?
就是说对序号按照正常的排序.序号不重复,自动增加可以吗?
(我不想用序列)
加载更多回复(4)

2,596

社区成员

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

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