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 日将重复条目的其他详细信息。希望这可以帮助。如果你能详细一点,我可以帮你实现你的要求。
谢谢。
我正在尝试检索最近 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 日将重复条目的其他详细信息。希望这可以帮助。如果你能详细一点,我可以帮你实现你的要求。
谢谢。