Количество отсутствующих строк в диапазоне дат - PullRequest
1 голос
/ 23 августа 2011

У меня есть таблица со следующей структурой

 transaction_id    user_id     date_column   
   1                  1        01-08-2011     
   2                  2        01-08-2011    
   3                  1        02-08-2011   
   4                  1        03-08-2011

На каждую дату может быть не более одной записи для каждого пользователя.

Как получить все строки, где user_id отсутствует для определенного диапазона дат. Поэтому для приведенной выше таблицы с user_id= 2 и диапазоном дат с 01-08-2011 по 03-08-2011 я хочу

result
02-08-2011
03-08-2011

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

1 Ответ

2 голосов
/ 23 августа 2011

Как предлагается в комментарии, создайте таблицу с интересующими датами (я назову ее datesofinterest).Каждую дату из вашего диапазона дат нужно поместить в эту таблицу.

datesofinterest table
--------------
date
--------------
01-08-2011
02-08-2011
03-08-2011

Затем необходимо объединить таблицу даты интереса со всеми идентификаторами пользователей - это набор всех возможных комбинаций дат интереса и идентификаторов пользователей.

Теперь вам нужноудалите все те даты-интересов / идентификаторов пользователей, которые в настоящее время находятся в исходной таблице, чтобы получить ваш окончательный ответ.

В реляционной алгебре это будет что-то вроде:

(datesofinterest[date] x transaction[user_id]) - (transaction[date_column, user_id])

Эта страница может помочь с переводом '-' в SQL. Генерация дат для заполнения таблицы datesofinterest может быть выполнена на SQL, вручную или с помощью вспомогательной программы ( DateTime perl )

...