查找一个范围之间的日期并从另一个查询中获取值并在其上迭代范围的SQL查询?
对不起,如果这个问题的措辞很奇怪。我不知道该怎么说,但以下是上下文: 我正在开发一个应用程序,它显示了当用户从我的web服务器发出请求时,单个应用程序的使用频率的一些数据。我们获取数据的方式是,每次加载起始页时,它都会在加载日期增加一个名为WEB_TRACKING的数据表。因此,数据中存在很多漏洞,例如,一个应用程序可能在9月1日被大量使用,但在9月2日根本没有。我想做的是,添加那些命中值为0的孔。这就是我想到的查找一个范围之间的日期并从另一个查询中获取值并在其上迭代范围的SQL查询?,sql,oracle,Sql,Oracle,对不起,如果这个问题的措辞很奇怪。我不知道该怎么说,但以下是上下文: 我正在开发一个应用程序,它显示了当用户从我的web服务器发出请求时,单个应用程序的使用频率的一些数据。我们获取数据的方式是,每次加载起始页时,它都会在加载日期增加一个名为WEB_TRACKING的数据表。因此,数据中存在很多漏洞,例如,一个应用程序可能在9月1日被大量使用,但在9月2日根本没有。我想做的是,添加那些命中值为0的孔。这就是我想到的 Select HIT_DATA.DATE_ACCESSED, HIT_DATA.A
Select HIT_DATA.DATE_ACCESSED, HIT_DATA.APP_ID, HIT_DATA.NAME, WORKDAYS.BENCH_DAYS, NVL(HIT_DATA.HITS, 0) from (
select DISTINCT( TO_CHAR(WEB.ACCESS_TIME, 'MM/DD/YYYY')) as BENCH_DAYS
FROM WEB_TRACKING WEB
) workDays
LEFT join (
SELECT TO_CHAR(WEB.ACCESS_TIME, 'MM/DD/YYYY') as DATE_ACCESSED, APP.APP_ID, APP.NAME,
COUNT(WEB.IP_ADDRESS) AS HITS
FROM WEB_TRACKING WEB
INNER JOIN WEB_APP APP ON WEB.APP_ID = APP.APP_ID
WHERE APP.IS_ENABLED = 1 AND (APP.APP_ID = 1 OR APP.APP_ID = 2)
AND (WEB.ACCESS_TIME > TO_DATE('08/04/2018', 'MM/DD/YYYY')
AND WEB.ACCESS_TIME < TO_DATE('09/04/2018', 'MM/DD/YYYY'))
GROUP BY TO_CHAR(WEB.ACCESS_TIME, 'MM/DD/YYYY'), APP.APP_ID, APP.NAME
ORDER BY TO_CHAR(WEB.ACCESS_TIME, 'MM/DD/YYYY'), app_id DESC
) HIT_DATA ON HIT_DATA.DATE_ACCESSED = WORKDAYS.BENCH_DAYS
ORDER BY WORKDAYS.BENCH_DAYS
但我希望它与多个应用程序配合使用:
| APP_ID | NAME | BENCH_DAYS | HITS |
| ------ | ---------- | ---------- | ---- |
| 1 | test_app | 08/04/2018 | 0 |<- these 0's are converted from null
| 1 | test_app | 08/05/2018 | 1 |
| 1 | test_app | 08/06/2018 | 0 | <- these 0's are converted from null
| 2 | prod_app | 08/04/2018 | 2 |
| 2 | prod_app | 08/05/2018 | 0 | <- these 0's are converted from null
在这篇长篇文章中再次重申这个问题。我应该如何填充此查询,以便它填补日期中的漏洞,同时重用应用程序名称和ID并填充该信息?您需要一个日期列表,该列表可能来自数字生成器,而不是一个表如果该表有漏洞,您的报告也会出现 例如,过去30天的每个日期:
select trunc(sysdate-30) + level as bench_days from dual connect by level < 30
使用TRUNC而不是将日期转换为字符串以缩短时间
现在,您有了一个日期列表,您希望添加重复的应用程序id和名称:
select * from
(select trunc(sysdate-30) + level as bench_days from dual connect by level < 30) dat
CROSS JOIN
(select app_id, name from WEB_APP WHERE APP.IS_ENABLED = 1 AND APP_ID in (1, 2) app
现在你有了所有的约会,所有的应用程序都有了。2个应用和30天将通过交叉连接生成60行结果集。左键将您的统计数据加入其中,然后分组/计数/求和/聚合
select app.app_id, app.name, dat.artificialday, COALESCE(stat.ct, 0) as hits from
(select trunc(sysdate-30) + level as artificialday from dual connect by level < 30) dat
CROSS JOIN
(select app_id, name from WEB_APP WHERE APP.IS_ENABLED = 1 AND APP_ID in (1, 2) app
LEFT JOIN
(SELECT app_id, trunc(access_time) accdate, count(ip_address) ct from web_tracking group by app_id, trunc(access_time)) stat
ON
stat.app_id = app.app_id AND
stat.accdate = dat.artificialday
您不必以这种方式编写查询/将分组作为子查询,我只是以这种方式表示它,以引导您思考数据块中的数据,这些数据块是单独构建的,稍后再连接在一起,以构建更全面的块欢迎使用SO。您的查询似乎是一个典型的如何填补oracle中日期空白的问题,对此的web搜索应该会返回大量的点击率。举个例子:@Caius Jard-Hmm这就是我的想法,我找到了一个我认为合适的解决方案,但最终并不是我想要的。哦,好吧,我想我得做更多的研究。谢谢你为我指明了正确的方向。谢谢你抽出时间。这些信息确实有帮助:D
select app.app_id, app.name, dat.artificialday, COALESCE(stat.ct, 0) as hits from
(select trunc(sysdate-30) + level as artificialday from dual connect by level < 30) dat
CROSS JOIN
(select app_id, name from WEB_APP WHERE APP.IS_ENABLED = 1 AND APP_ID in (1, 2) app
LEFT JOIN
(SELECT app_id, trunc(access_time) accdate, count(ip_address) ct from web_tracking group by app_id, trunc(access_time)) stat
ON
stat.app_id = app.app_id AND
stat.accdate = dat.artificialday