是否使用SQL查询对日期范围内的项目进行计数?
首先,我知道这一点足以让自己陷入困境。我正在为AS/400系统编写一个查询。我有一个包含开始日期和结束日期的文件。我要做的是创建一个查询,该查询可以计算在一个日期范围内打开了多少行项目。(对于我的应用程序,打开的定义为:是否使用SQL查询对日期范围内的项目进行计数?,sql,date,db2,datefilter,Sql,Date,Db2,Datefilter,首先,我知道这一点足以让自己陷入困境。我正在为AS/400系统编写一个查询。我有一个包含开始日期和结束日期的文件。我要做的是创建一个查询,该查询可以计算在一个日期范围内打开了多少行项目。(对于我的应用程序,打开的定义为:DATE>START\u DATE和(DATE='20200210' 或结束日期='0' ) 这很好,但很耗时。从这里开始,我不知道如何转换到所需的输出…或者即使可能…但这将加快我的速度。提前感谢 另外,欢迎您提供任何帮助,如果您知道如何在mySQL等中实现这一点,请与我们分享
DATE>START\u DATE
和(DATE='20200210'
或结束日期='0'
)
这很好,但很耗时。从这里开始,我不知道如何转换到所需的输出…或者即使可能…但这将加快我的速度。提前感谢
另外,欢迎您提供任何帮助,如果您知道如何在mySQL等中实现这一点,请与我们分享。我可以接受这些帮助,并与它一起运行,以使其在AS/400中发挥作用。这就是我现在所处的位置
****************编辑以进行澄清
1.现行守则
提供的当天代码就是我的全部。我不知道从哪里开始
根据我的要求。
2.示例数据:
Line Item START_DATE END_DATE
1 20200206 20200210
2 20200207 20200210
3 20200207 20200207
基本上,我希望这是一个迭代式的计算方式。从我的python/java背景来看,这对我来说是有意义的。我不是在寻找5天前打开的所有内容,我想从5天前开始,计算这5天中每一天打开了多少行项目。如果这在GROUP中确实是可能的,请详细说明同时,我将开始为达到这一目的而进行分组
SELECT COUNT(*) FROM MYFILE WHERE (START_DATE < '20200205' AND (END_DATE >= '20200210' OR END_DATE = '0')) GROUP BY DATE_FORMAT(START_DATE , '%Y%m%d')
从MYFILE中选择计数(*),其中(开始日期<'20200205'和(结束日期>='20200210'或结束日期='0')按日期分组格式(开始日期,'%Y%m%d'))
听起来像是group by
语句的一个简单用法,但您没有说明分组依据的列,只是一个日期,我假设是开始日期
我不知道AS/400 SQL,所以我将有点抽象,并假设CURRENT_DATE()返回您所在地区的当前日期。RDBMS在这方面有所不同
考虑到这些假设,以下内容应该会有所帮助:
挑选
开始日期为日期,
将(*)计算为打开状态
从…起
我的文件
哪里
开始日期>=(当前日期()-5)
及(
结束日期>=(当前日期()-5)
或结束日期='0'
)
分组
开始日期
取消激活数据并使用窗口函数进行聚合。以下是想法:
with se as (
select dte, sum(ins) as ins, sum(outs) as outs
from ((select start_date as dte, count(*) as ins, 0 as outs
from t
) union all
(select end_date, 0, count(*) as outs
from t
)
)
select dte, ins, outs,
(sum(sum(ins)) over (order by dte) -
sum(sum(outs)) over (order by dte)
)
from se
order by dte;
这将一天的所有开始相加,并减去结束数
注:
- 如果要按日期筛选,请将筛选逻辑放在外部查询中
- 这假设所有日期都是有效的。如果某些日期是特殊的,则需要在订购人中考虑到这一点
- 这不计算某人离开当天的天数。如果要计算他们,只需将子查询中的
结束日期添加到1天即可
- 下面是一个查询,返回给定日期和给定日期之间的连续日期-5天。当然,您可以使用
当前日期
而不是此常量
WITH T (DT) AS
(
VALUES DATE('2020-02-13') - 5 DAYS
UNION ALL
SELECT DT + 1 DAY
FROM T
WHERE DT < DATE('2020-02-13')
)
SELECT DT FROM T;
这种“虚拟表”的进一步使用是显而易见的:您可以
在B.START\u DATEDBMS
?请用它标记您的问题(我想您提到的是mySQL
)如果我没有弄错AS/400是IBM提供的DB2对吗?如果是这样的话,你能用DB2更新问号吗?选择M.MY_DAY,COUNT(*)FROM(选择DISTINCT(START_DATE)作为MYFILE的MY_DAY FROM,其中START_DATE>=REPLACE(CHAR(CURRENT DATE-5 DAY,ISO),“-”,ORDER by START by START_DATE)作为M LEFT加入MYFILE P ON M.MY_DAY>P.START_DATE和(M.MY_DAY那是最后一个问题。谢谢你的帮助,我不知道加入条件可以这样使用。我给了你一张赞成票,但我太新了,我的票无法计算。
with se as (
select dte, sum(ins) as ins, sum(outs) as outs
from ((select start_date as dte, count(*) as ins, 0 as outs
from t
) union all
(select end_date, 0, count(*) as outs
from t
)
)
select dte, ins, outs,
(sum(sum(ins)) over (order by dte) -
sum(sum(outs)) over (order by dte)
)
from se
order by dte;
WITH T (DT) AS
(
VALUES DATE('2020-02-13') - 5 DAYS
UNION ALL
SELECT DT + 1 DAY
FROM T
WHERE DT < DATE('2020-02-13')
)
SELECT DT FROM T;
|DT |
|----------|
|2020-02-08|
|2020-02-09|
|2020-02-10|
|2020-02-11|
|2020-02-12|
|2020-02-13|