LEFT JOIN не показывает дни с нулевым COUNT - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь получить данные за последние 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

КакВы можете видеть, что дни не отображаются в запросе.

Ответы [ 4 ]

2 голосов
/ 08 ноября 2019

Вместо этого сделайте 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, чтобы получить 0 для несуществующих дней table_a. (COUNT(*) вернет 1 ...)

1 голос
/ 08 ноября 2019

Вы должны быть в состоянии упростить это следующим образом:

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нет необходимости приводить его
  • Teradata позволяет вам ссылаться на псевдонимные столбцы без необходимости делать внешний SELECT
  • замененный COUNT(*) на COUNT(a.TIMESTAMP_T) для более точного подсчета (спасибо, jarlh)
0 голосов
/ 08 ноября 2019

Не могли бы вы объяснить подробнее об этом? Будут ли таблицы А иметь даты, только если они имеют записи. Предполагая, что у меня было похожее требование:

выберите temp1.qwer, count (temp1.DATDAY) из (выберите * из (ВЫБРАТЬ TRUNC (SYSDATE, 'MM') + УРОВЕНЬ - 1 КАК qwer ОТ двойного t СОЕДИНИТЬBY TRUNC (TRUNC (SYSDATE, 'MM') + УРОВЕНЬ - 1, 'MM') = TRUNC (SYSDATE, 'MM')) temp ВЛЕВО СОЕДИНИТЬorder by temp1.qwer;

Этот запрос сгенерирует список записей за месяц и подсчитает, сколько записей было сделано в Temp1_check.

Temp1_Check с списком дат и соответствующими им записями. Например: если 9 ноября будет 10 попыток, то 9 ноября будет повторяться с другими деталями записей. Надеюсь это поможет. Если вы можете уточнить немного больше, я могу помочь вам выполнить ваши требования.

Спасибо.

0 голосов
/ 08 ноября 2019

Поменяйте местами соединение или правое внешнее соединение, или переверните таблицы, так как данные в таблице календаря будут больше

...