如何在我的输入的每一行中获取最早日期和最早日期之间的天数

Posted

技术标签:

【中文标题】如何在我的输入的每一行中获取最早日期和最早日期之间的天数【英文标题】:How to get number of days between the earliest date and the oldest date in every row of my input 【发布时间】:2017-08-17 13:43:52 【问题描述】:

我很难获得最早日期和最新日期之间的天数,我遇到的问题是如果我使用 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 准备的

【问题讨论】:

什么是“EXAMPLE” 你的示例数据是两列吗?请澄清。 【参考方案1】:

在解析版本中使用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 是可选的,但请仔细阅读文档并理解差异。

【讨论】:

与 RATE_CODE_STAT_DAILY (RATE_CODE, BUSINESS_DATE) 为 (select RATE_CODE, BUSINESS_DATE from dual ) select RATE_CODE, BUSINESS_DATE, max(BUSINESS_DATE) over () - min(BUSINESS_DATE) over () + 1 diff from RATE_CODE_STAT_DAILY 您好,请思考,非常感谢上述内容,我遇到了困难,因为我的 SQLDeveloper 在从上述查询中选择后,错误提示 RATE_CODE 上的标识符无效【参考方案2】:

下面的内容正是我所需要的——感谢@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'

【讨论】:

我认为你应该使用minmax。您在 cmets 中附加的查询不起作用,因为 dual 没有像 rate_code 这样的列。只需在您的答案中将 first_value 替换为 min 并将 last_value 替换为 max 并在真实表上工作。但是,如果您坚持使用first_value 并且它对您有效,那没关系。对我来说,这看起来有点可疑。

以上是关于如何在我的输入的每一行中获取最早日期和最早日期之间的天数的主要内容,如果未能解决你的问题,请参考以下文章

如何返回最早日期的记录?

选择每隔一条记录,然后确定最早的日期

如何获取每组最早日期的记录

Scala RDD按组获取最早日期

获取不同年份中按日/月的最早日期

sql查询获取最早日期