我很难获得最早日期和最新日期之间的天数,我遇到的问题是如果我使用MIN
或MAX
我必须按列分组,这是一个问题,因为我没有要分组的列。
如果我的数据如下所示:
2017/01/01 EXAMPLE
2017/01/01 EXAMPLE
2017/01/01 EXAMPLE
2017/01/05 EXAMPLE
2017/01/06 EXAMPLE
2017/01/06 EXAMPLE
2017/01/08 EXAMPLE
我需要在整个表中添加一个带有静态数字的列,因此它看起来像:
2017/01/01 EXAMPLE 8
2017/01/01 EXAMPLE 8
2017/01/01 EXAMPLE 8
2017/01/05 EXAMPLE 8
2017/01/06 EXAMPLE 8
2017/01/06 EXAMPLE 8
2017/01/08 EXAMPLE 8
这可能很简单,但我只是无法在不分组的情况下正确完成 - 8 是最早一天和最后一天之间的天数
这是针对甲骨文的
在分析版本中使用max()
和min()
:
select dt, str, max(dt) over () - min(dt) over () + 1 diff
from t
例:
with t (dt, str) as (
select date '2017-01-01', 'EXAMPLE' from dual union all
select date '2017-01-01', 'EXAMPLE' from dual union all
select date '2017-01-01', 'EXAMPLE' from dual union all
select date '2017-01-05', 'EXAMPLE' from dual union all
select date '2017-01-06', 'EXAMPLE' from dual union all
select date '2017-01-06', 'EXAMPLE' from dual union all
select date '2017-01-08', 'EXAMPLE' from dual)
select dt, str, max(dt) over () - min(dt) over () + 1 diff
from t
结果:
DT STR DIFF
----------- ------- ----------
2017-01-01 EXAMPLE 8
2017-01-01 EXAMPLE 8
2017-01-01 EXAMPLE 8
2017-01-05 EXAMPLE 8
2017-01-06 EXAMPLE 8
2017-01-06 EXAMPLE 8
2017-01-08 EXAMPLE 8
7 rows selected
编辑: 您的查询应为:
select RATE_CODE, BUSINESS_DATE,
max(BUSINESS_DATE) over () - min(BUSINESS_DATE) over () + 1 diff
from RATE_CODE_STAT_DAILY
您不需要with
子句,我添加它只是为了制作一些示例数据。只需使用上面的查询。而且我不知道真正的表名和列名。
在这种情况下,您应该使用min
和max
.First_value
和last_value
是替代的,但请仔细阅读文档并了解差异。
下面给了我我需要的 - 谢谢你@ponder对分析的提示,做了一些研究,遇到了FIRST_VALUE和LAST_VALUE
select
RATE_CODE,
BUSINESS_DATE,
FIRST_VALUE(BUSINESS_DATE) over() AS FIRSTDATE,
LAST_VALUE(BUSINESS_DATE) over(ORDER BY RATE_CODE RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LASTDATE
from RATE_CODE_STAT_DAILY
where BUSINESS_DATE > '01-JUL-17'