LEFT JOIN 不显示计数为零的日子

LEFT JOIN not showing days with zero COUNT

我正在尝试检索最近 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

如您所见,查询未显示某些天数。

改为 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(*) 会 return 1...)

交换连接右外连接或反转 tables 因为日历 table 中的数据会更多

你应该可以像这样简化它:

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

几个注意事项:

  • sys_calendar.calendar 视图中的 calendar_date 字段是 DATE,不需要转换它
  • Teradata 允许您引用别名列而无需执行外部 SELECT
  • COUNT(*) 替换为 COUNT(a.TIMESTAMP_T) 以获得更准确的计数(感谢 jarlh)

你能解释一下吗? Table A 只有在有条目的情况下才有日期。假设,我有类似的要求:

select temp1.qwer ,count(temp1.DATDAY) 从 ( select * 来自 (SELECT TRUNC(SYSDATE, 'MM') + LEVEL - 1 AS qwer 从双吨 通过 TRUNC(TRUNC(SYSDATE, 'MM') + LEVEL - 1, 'MM') = TRUNC(SYSDATE, 'MM'))temp 连接 左连接 Temp1_check t1 在 temp.qwer=t1.DATDAY )temp1 按 temp1.qwer 分组 按 temp1.qwer;

排序

此查询将生成当月的条目列表,并计算 Temp1_check 上的条目数。

Temp1_Check 具有日期列表及其各自的条目。例如:如果 11 月 9 日有 10 次尝试,则 11 月 9 日将重复条目的其他详细信息。希望这可以帮助。如果你能详细一点,我可以帮你实现你的要求。

谢谢。