我正在尝试检索最近X天的数据,并计算每天的新行。我还需要获得COUNT = 0的日子。
我现在的查询是:
SELECT COUNT(*), CAST(TIMESTAMP_T AS DATE)
FROM TABLE_A a
LEFT OUTER JOIN
(SELECT CAST(CALENDAR_DATE AS DATE) as DATE0
FROM SYS_CALENDAR.CALENDAR) b
ON CAST(a.TIMESTAMP_T AS DATE) = b.DATE0
WHERE b.DATE0 BETWEEN CURRENT_DATE - INTERVAL '7' DAY AND CURRENT_DATE
GROUP BY CAST(a.TIMESTAMP_T AS DATE)
ORDER BY CAST(a.TIMESTAMP_T AS DATE) DESC
它返回以下内容:
255 2019-11-07
922 2019-11-06
342 2019-11-05
176 2019-11-04
18 2019-11-02
224 2019-11-01
如您所见,查询没有显示几天。
答案 0 :(得分:2)
改为使用RIGHT OUTER JOIN
,以包括那些日子:
SELECT COUNT(a.TIMESTAMP_T), b.DATE0
FROM TABLE_A a
RIGHT OUTER JOIN(SELECT CAST(CALENDAR_DATE AS DATE) as DATE0 FROM SYS_CALENDAR.CALENDAR) b ON CAST(a.TIMESTAMP_T AS DATE)=b.DATE0
WHERE b.DATE0 BETWEEN CURRENT_DATE - INTERVAL '7' DAY AND CURRENT_DATE
GROUP BY b.DATE0
ORDER BY b.DATE DESC
由于您想要所有日历日,即使没有任何TABLE_A行的日历日。
COUNT()
的table_a列,以在不存在的table_a天中获得0。 (COUNT(*)
将返回1 ...)
答案 1 :(得分:1)
您应该能够像这样简化它:
SELECT COUNT(a.TIMESTAMP_T), b.CALENDAR_DATE
FROM SYS_CALENDAR.CALENDAR b
LEFT JOIN TABLE_A a ON CAST(a.TIMESTAMP_T AS DATE) = b.CALENDAR_DATE
WHERE b.CALENDAR_DATE BETWEEN CURRENT_DATE - INTERVAL '7' DAY AND CURRENT_DATE
GROUP BY b.CALENDAR_DATE
ORDER BY b.CALENDAR_DATE DESC
一些注意事项:
calendar_date
视图中的sys_calendar.calendar
字段为DATE
,无需强制转换SELECT
COUNT(*)
替换为COUNT(a.TIMESTAMP_T)
,以获得更准确的计数(感谢jarlh)答案 2 :(得分:0)
由于日历表中的数据会更多
,所以可以互换外部联接或反向联接表答案 3 :(得分:0)
请您详细说明一下吗?表A仅在有条目时才有日期。假设,我有类似的要求:
选择temp1.qwer,count(temp1.DATDAY) 来自( 选择*从 (SELECT TRUNC(SYSDATE,'MM')+ LEVEL-1 AS qwer 从双t 通过TRUNC连接(TRUNC(SYSDATE,'MM')+ LEVEL-1,'MM')= TRUNC(SYSDATE,'MM'))temp 左联接 temp.qwer = t1.DATDAY上的Temp1_check t1) 按temp1.qwer分组 按temp1.qwer排序;
此查询将生成当月的条目列表,并计算在Temp1_check上进行的条目数量。
Temp1_Check with具有日期列表及其各自的条目。例如:如果11月9日进行10次尝试,则11月9日将与条目的其他详细信息重复。希望这可以帮助。如果您能详细说明,我可以帮助您实现您的要求。
谢谢。