如何在我的输入的每一行中获取最早日期和最早日期之间的天数
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 【问题描述】:我很难获得最早日期和最新日期之间的天数,我遇到的问题是如果我使用 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 是最早一天和最后一天之间的天数
这是为 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
子句,我添加它只是为了制作一些示例数据。只需使用上面的查询。而且我不知道真正的表名和列名。
在这种情况下,您应该使用min
和max
。 First_value
和 last_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'
【讨论】:
我认为你应该使用min
和max
。您在 cmets 中附加的查询不起作用,因为 dual
没有像 rate_code
这样的列。只需在您的答案中将 first_value
替换为 min
并将 last_value 替换为 max
并在真实表上工作。但是,如果您坚持使用first_value
并且它对您有效,那没关系。对我来说,这看起来有点可疑。以上是关于如何在我的输入的每一行中获取最早日期和最早日期之间的天数的主要内容,如果未能解决你的问题,请参考以下文章