filedType          filedName             filedValue
type1              name1                 value1
type1              name1                 value1
type1              name2                 value1
type1              name2                 value1
type1              name2                 value1
type1              name3                 value1
type2              name1                 value1
type2              name1                 value1
type2              name1                 value1
type3              name2                 value1
一、需求:
1、针对filedType分组
2、分组后count filedName,只显示count结果Top 2的。
二、例子:
例如数据如上啊,希望结果是:
filedType          filedName             filedValue
type1              name1                 value1
type1              name1                 value1
type1              name2                 value1
type1              name2                 value1
type1              name2                 value1
type2              name1                 value1
type2              name1                 value1
type2              name1                 value1
type3              name2                 value1其中数据
type1              name3                 value1 被过滤掉了。三、解释:
1、首先数据有三种类型
type1
type2
type32、然后type1的filedName有三种类型分别是
name1 2条记录。
name2 3条记录。
name3 1条记录。3、只保留按照filedName类型数量最多的前两个类型的数据即
name1 2条记录。
name2 3条记录。
所以去掉name3这条记录
4、type2、type3类型逻辑同上。

解决方案 »

  1.   

    SELECT filedtype,filedname,filedvalue
    FROM
       (SELECT filedtype,filedname,filedvalue,
           dense_rank () over (PARTITION BY filedtype ORDER BY cnt DESC) dr
        FROM
          (SELECT filedtype,filedname,filedvalue,
              COUNT(filedname) over (PARTITION BY filedtype,filedname) cnt
           FROM test))
    WHERE dr<=2;
      

  2.   

    SELECT *
      FROM test
     WHERE (filedType, filedName) IN 
           (SELECT filedType, filedName
              FROM (SELECT filedType,
                           filedName,
                           row_number() over(PARTITION BY filedType, filedName ORDER BY cnt DESC) row_num
                      FROM (SELECT filedType, filedName, COUNT(*) cnt
                              FROM test
                             GROUP BY filedType, filedName))
             WHERE row_num <= 2);
      

  3.   

    呵呵 debug一下 哥们别介意噢 应该把partition by后面的filedName去掉
      

  4.   

    不然所有行的row_number()结果都是1
      

  5.   

    SQL> SELECT *
      2    FROM test
      3   WHERE (fieldType, fieldName) IN
      4         (SELECT fieldType, fieldName
      5            FROM (SELECT fieldType,
      6                         fieldName,
      7                         row_number() over(PARTITION BY fieldType, fieldName
    ORDER BY cnt DESC) row_num
      8                    FROM (SELECT fieldType, fieldName, COUNT(*) cnt
      9                            FROM test
     10                           GROUP BY fieldType, fieldName))
     11           WHERE row_num <= 2);FIELDTYPE            FIELDNAME            FIELDVALUE
    -------------------- -------------------- --------------------
    type1                name1                value1
    type1                name1                value1
    type1                name2                value1
    type1                name2                value1
    type1                name2                value1
    type1                name3                value1
    type2                name1                value1
    type2                name1                value1
    type2                name1                value1
    type2                name2                value1已选择10行。--去掉fieldName
    SQL> SELECT *
      2  FROM test
      3  WHERE (fieldType, fieldName) IN
      4  (SELECT fieldType, fieldName
      5  FROM (SELECT fieldType,
      6  fieldName,
      7  row_number() over(PARTITION BY fieldType ORDER BY cnt DESC) row_num
      8  FROM (SELECT fieldType, fieldName, COUNT(*) cnt
      9  FROM test
     10  GROUP BY fieldType, fieldName))
     11  WHERE row_num <= 2);FIELDTYPE            FIELDNAME            FIELDVALUE
    -------------------- -------------------- --------------------
    type1                name1                value1
    type1                name1                value1
    type1                name2                value1
    type1                name2                value1
    type1                name2                value1
    type2                name1                value1
    type2                name1                value1
    type2                name1                value1
    type2                name2                value1已选择9行。另外请问一下,你写这个SQL的时候是在什么环境下写的?PL/SQL DEV吗
    每行都缩进、以及关键字都大小写都是你自己手工输入都还是系统会自动识别出关键字并置为大写?
      

  6.   

    SELECT filedtype,filedname,filedvalue 
    FROM 
      (SELECT filedtype,filedname,filedvalue, 
          dense_rank () over (PARTITION BY filedtype ORDER BY cnt DESC) dr 
        FROM 
          (SELECT filedtype,filedname,filedvalue, 
              COUNT(filedname) over (PARTITION BY filedtype) cnt 
          FROM test)) 
    WHERE dr <=2;
      

  7.   

    我也有同样的疑问,不过好像不是PL/SQL DEV。 我用半年了 ,没发现有这个功能啊,汗。
      

  8.   

    呵呵 也说不定是tangren有良好编码习惯 自己手工打的
      

  9.   

    SELECT FILEDTYPE,FILEDNAME,FILEDVALUE FROM
    (SELECT A.*,DENSE_RANK() OVER(PARTITION BY FILEDTYPE ORDER BY FILEDNAME) AS R FROM TEST A)
    WHERE R<=2
      

  10.   

    感谢大家啊。。那我等待知道答案了在结贴啊。【
    呵呵 也说不定是tangren有良好编码习惯 自己手工打的