提供数据
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? 您的意见分别是什么?
答案 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
文档中的示例一样)。有很多可用的工具,你需要选择最适合你想要实现的工具。