2017-08-17 82 views
1

我很难得到最早日期和最新日期之间的天数,我遇到的问题是如果我使用MINMAX我不得不按专栏分组,这是一个问题,因为我没有要分组的专栏。如何获取我输入的每一行中最早的日期和最早的日期之间的天数

如果我的数据是这样的:

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是最早的一天和最后一天之间的天数

这是为ORACLE

+0

什么是“实例”就是你们的榜样数据两列来的?请澄清。 – OldProgrammer

回答

4

使用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子句,我只是添加它来创建一些示例数据。只需使用上面的查询。我不知道真正的表名和列名。

在这种情况下,您应该使用minmaxFirst_valuelast_value是替代方案,但请仔细阅读文档并了解差异。

+0

与RATE_CODE_STAT_DAILY(RATE_CODE,BUSINESS_DATE)如( 选择 RATE_CODE, BUSINESS_DATE 从双 ) 选择RATE_CODE,BUSINESS_DATE,最大值(BUSINESS_DATE)以上() - 分钟(BUSINESS_DATE)以上()+ 1 DIFF 从RATE_CODE_STAT_DAILY – DSmith

+0

Hi Ponder,非常感谢以上内容,我很困难,因为我的SQLDeveloper在从上面的查询中选择后在RATE_CODE上踢出无效标识符 – DSmith

0

下面给了我正是我需要的 - 谢谢你@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' 
+0

我认为您应该使用'min'和'max'。您在注释中附加的查询不起作用,因为'dual'没有像'rate_code'这样的列。只需在你的答案中用'min'和last_value替换'first_value'并在'real表上工作。但是,如果你坚持'first_value'并且它适用于你,那么这是可以的。对我而言,这看起来有点可疑。 –