阿里云
发表主题 回复主题
  • 508阅读
  • 9回复

按照A字段排序取前十名,且B字段不重复,求sql,简洁点的最好不要有嵌套子查询

级别: 小白
发帖
0
云币
-18
测试表:

with t as(

select rownum p_id,

       trunc(dbms_random.value * 10) p_name,

       sysdate + rownum p_date

  from dual

connect by rownum < 2000)

select * from t

需求是按照日期p_date倒序取前30条数据,而且要求p_name不重复

最好是最简单一句sql搞定  嵌套子查询越少越好。




重复, 最好, 查询, select, from






级别: *
发帖
*
云币
*




这个应该不满足需求 ROWNUM < 31中的 rownum不是排序后的rownum
级别: *
发帖
*
云币
*


with t as(

SELECT ROWNUM P_ID,

       TRUNC(DBMS_RANDOM.VALUE * 10) P_NAME,

       SYSDATE + ROWNUM P_DATE

  FROM DUAL

CONNECT BY ROWNUM < 2000)

SELECT P_ID, P_NAME, P_DATE

  FROM (SELECT P_ID,

               P_NAME,

               P_DATE,

               ROW_NUMBER() OVER(PARTITION BY P_Name ORDER BY P_DATE DESC) RN

          FROM T

         ORDER BY 3 DESC)

WHERE RN = 1

   AND ROWNUM < 31


不知道是不是你要的结果,P_name不重复就只能有10行数据
级别: *
发帖
*
云币
*


这个是可以实现需求不知道有没更好的办法

with t as

(select rownum p_id,

         trunc(dbms_random.value * 10) p_name,

         sysdate + rownum p_date

    from dual

  connect by rownum < 2000)

select p_id, p_name, p_date

  from (select p_id,

               p_name,

               p_date,

               dense_rank() over(partition by p_name order by p_date) rn

          from t

         order by p_date)

where rn = 1

   and rownum < 30

级别: *
发帖
*
云币
*




你目前的语句是先最大连数据进行排序, 然后过滤, 我前面提供的语句是先分组后排序过滤, 我的语句应该是等效的, 至于效率如何, 你可以自己测试一下, 看看执行计划如何
级别: *
发帖
*
云币
*




好 谢谢
级别: *
发帖
*
云币
*




跟p_id是没关系,p_id,只是我随便举的一个字段,可以去掉的

就是根据pdate倒序排序,而且pname不重复的前三十条数据,不知道我描述的是不是清楚
级别: *
发帖
*
云币
*




那你的测试一下我的语句, 如果不对, 用简单的数据举例说明
级别: *
发帖
*
云币
*


用12c fetch first x rows
级别: *
发帖
*
云币
*




不知道是不是如下的意思, 如果不是, 请详细说明!



select  p_id,

        p_name,

        p_date

from         

(select max(p_id) keep(dense_rank first order by p_date) p_id,

        p_name,

        max(p_date) p_date,

        row_number() over(order by max(p_date) desc) rn

  from t1

group by p_name)

where rn <= 30;

发表主题 回复主题
« 返回列表
«12345678910»
共10页
上一主题下一主题

限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
验证问题: 56 + 38 = ?
上一个 下一个

      版权声明

      开发者论坛为你提供“按照A字段排序取前十名,且B字段不重复,求sql,简洁点的最好不要有嵌套子查询”的内容,论坛中还有更多关于 字段重复iframe嵌套子页面嵌套子查询简洁查询字段重复 的内容供你使用,该内容是网友上传,与开发者论坛无关,如果需要删除请联系zixun-group@service.aliyun.com,工作人员会在5个工作日内回复您。