现在遇见个问题,现在生成的一张表中:A  B  C
1  2  1
3  4  1
5  6  2
7  8  2.......也就是说,每行数据除了C字段可能相同外,其他字段不会完全相同,现在要根据c分组,然后每个组中任意选择一行生成结果,比如结果可以是A  B  C
1  2  1
5  6  2
也可以是:
A B C 
3 4 1
7 8 2这个查询如何实习呢, 我知道有一个关键字叫做distinct 但是好像只能对查询一个字段有用吧  比如可以查到
distinct C   用作distinct * 就不行呀

解决方案 »

  1.   

    with tab as (
    select '1' as A,  '2'as  B, '1' as C from dual union
    select '3' as A,  '4'as  B, '1' as C from dual union
    select '5' as A,  '6'as  B, '2' as C from dual union
    select '7' as A,  '8'as  B, '2' as C from dual)
    select (select tab.a
              from tab
             where tab.c = t.c
               and rownum = 1) A,
           (select tab.b
              from tab
             where tab.c = t.c
               and rownum = 1) B,
           t.c
      from (select c from tab group by c) t
    根据C分组,然后任取一个A和B
      

  2.   

    select min(a), min(b),c,max(d),max(e) from tab group by c
    这样sql写起来简单 但是只能查min或者max
    如果可以任取的话 那取min或者max也没问题吧
      

  3.   

    这个问题很奇怪,能不能更加详细的描述一下呢。
    一个查询可以有两个结果集么?如卤煮所言:比如结果可以是A  B  C
    1  2  1
    5  6  2
    也可以是:
    A B C 
    3 4 1
    7 8 2
      

  4.   


    我觉着一个sql能够查询出不同的结果集,这个有点难度。要引入一些变动的量么?
      

  5.   

    with tab as (
    select 'a' as objid,'1' as A,  '2'as  B, '1' as C from dual union
    select 'b' as objid,'3' as A,  '4'as  B, '1' as C from dual union
    select 'c' as objid,'5' as A,  '6'as  B, '2' as C from dual union
    select 'd' as objid,'7' as A,  '8'as  B, '2' as C from dual)
    select *
      from tab t2
     where t2.objid in (select (select t.objid
                                  from tab t
                                 where tab.c = t.c
                                   and rownum = 1)
                          from tab
                         group by c)
    你的表里有没有唯一标识啊 如果有的话 可以分组后任取一个 查出来
    然后根据这些唯一标识再去查其他字段,这样就不用一个一个转换了
    否则 我就没有好办法了
      

  6.   


    with t as(
        SELECT 1 AS A,2 AS B,1 AS C FROM DUAL union ALL
        SELECT 3 AS A,4 AS B,1 AS C FROM DUAL union ALL
        SELECT 5 AS A,6 AS B,2 AS C FROM DUAL union ALL
        SELECT 7 AS A,8 AS B,2 AS C FROM DUAL
    )
    SELECT O.A,O.B,O.C FROM
    (SELECT T.A,T.B,T.C,ROW_NUMBER() OVER(PARTITION BY T.C ORDER BY T.C) D FROM T) O
    WHERE O.D=1;
    结果如下:
    A B C
    1 2 1
    5 6 2
    with t as(
        SELECT 1 AS A,2 AS B,1 AS C FROM DUAL union ALL
        SELECT 3 AS A,4 AS B,1 AS C FROM DUAL union ALL
        SELECT 5 AS A,6 AS B,2 AS C FROM DUAL union ALL
        SELECT 7 AS A,8 AS B,2 AS C FROM DUAL
    )
    SELECT O.A,O.B,O.C FROM
    (SELECT T.A,T.B,T.C,ROW_NUMBER() OVER(PARTITION BY T.C ORDER BY T.C) D FROM T) O
    WHERE O.D=2;
    结果如下:
    A B C
    3 4 1
    7 8 2
      

  7.   


    嗯嗯, 好的,  不过还有一个问题,我要查询的对象是又几个表联合查询生成的, 也就是A,B,C分别来自于不同的表, 现在我称生成的表为T ,A来自于T1,B来自于T2,C来自于T3, 我现在直接用T.C或者C去访问的话提示为明确定义列,用T3.C去访问又提示无效的标示符,怎么能访问到C呢
    求解
      

  8.   

    结果集  =  表
    你先使用T1 T2 T3 构建一个结果集,替代T1即可.
      

  9.   

    我的想法是这样的:
     利用分析函数依据每个c字段增加序号,每个都从1开始。然后,仅仅取序号为1的就行了。
    你参考下,我是以emp表为例的
    SELECT * FROM 
    (SELECT t.*,row_number() OVER (
    PARTITION BY t.deptno ORDER BY t.empno DESC
    ) rn  FROM emp t )
    WHERE rn=1
      

  10.   

    按照你的写法, 我改造了我的sql语句:SELECT O.* FROM
    (SELECT T.*,ROW_NUMBER() OVER(PARTITION BY LOGICALCODE ORDER BY LOGICALCODE) D FROM (SELECT * FROM 
    GISOPTIC T1 ,GISPORTSH T2,(SELECT MIN(ID) ID FROM GISOPTIC GROUP BY LOGICALCODE) T3 
    WHERE T1.ID=T3.ID AND (T1.APORTID=T2.ID OR T1.ZPORTID=T2.ID)) T) O
    WHERE O.D=1;现在就是PARTITION BY LOGICALCODE ORDER BY LOGICALCODE中LOGICALCODE如何访问的问题,这里面LOGICALCODE是T1里面的一个字段
      

  11.   

    没有看懂你的意思.... 你可以把row_number() over(partition by xxx)理解为在你的结果集里面增加了别名为D的一列,直接使用就可以了.就是rownum
      

  12.   

    就是partition by xxx中的xxx,我要怎么写, 如果写成LOGICALCODE或者T.Logicalcode会报未明确定义的列,如果写成T1.LOGICALCODE 的话, 会说无效的标识符