再见KEEP DENSE_RANK?

时间:2015-07-27 17:21:21

标签: oracle fetch

提供数据

  

Id sdate sales

     

1 15.03.2015 150

     

2 16.03.2015 170

其中id + date是唯一组合 人们可以很容易地找到最好的日期,或最好的销售项目。 Select max(date) keep(dense_rank last order by sales) from data

到目前为止一切顺利。但是假设我们有以下数据:

  

Id sdate sales

     

1 15.03.2015 150

     

2 16.03.2015 170

     

1 15.03.2015 117

     

2 16.03.2015 97

......其他一些日期最差销售金额超过15.03.2015和2015年3月16日

现在我想知道最好的销售日期

Select max(sdate) keep(dense_rank last order by sum(sales)) from data group by sdate。 嘿!它只显示15.03.2015。但我希望看到它 - 2015年3月15日和2015年3月16日。 LISTAGG也没有帮助。只有

Select sdate from data group by sdate
Order by sum(sales) DESC  FETCH FIRST ROW WITH TIES 

返回我的两个日期。那么,再见KEEP DENSE_RANK?遇见FETCH FIRST? 您的意见分别是什么?

1 个答案:

答案 0 :(得分:0)

他们正在做不同的事情。 keep只能为每个组返回一行。由于您希望查看绑定值,因此无法使用keep,但可以使用内联视图执行此操作:

select sdate
from (
  select sdate, dense_rank() over (order by sum(sales) desc) as rnk
  from data
  group by sdate
)
where rnk = 1;

在本例中,这基本上是fetch first rows with ties在12c中所做的事情。

在某些情况下keep是合适的,有些情况下内联视图或fetch first rows是合适的,有些情况可能会有效。

如果您无法使用keep获得所需结果,则并不意味着永远不会使用它。您的第一个更简单的查询可以使用任一方法;如果您想要其他信息,那么keep就会自成一体(就像first文档中的示例一样)。有很多可用的工具,你需要选择最适合你想要实现的工具。