2013-08-16 3 views
2

Представьте, что у меня есть две таблицы (см. Рисунок). В одном у меня есть даты, а в другом у меня есть счет для некоторых дат, которые находятся в первом.SQL join неполная таблица

Мне нужно присоединиться к этим таблицам, поэтому у меня есть для каждой даты в таблице. Дает самый обновленный счетчик (до этой даты). Например, для [Даты]. [Date] = 3 У меня нет [Counts]. [Count], поэтому мне нужно взять счет для [date] = 1.

Каков наилучший способ сделать это в SQL?

Надеюсь, вы можете меня понять :)

Спасибо!

enter image description here

+1

Можете ли вы предоставить данные о структуре и выборке? возможно, на http://sqlfiddle.com – Kris

+2

Это не может быть как mysql, так и sql-сервер. Что он? – Hogan

+0

Выглядит тривиально с помощью функции WINDOW() плюс совокупность SUM() BTW: дата - это зарезервированное слово (typename), и поэтому count (агрегатная функция). Для mysql (который не имеет функций WINDOW) вам придется использовать самосоединение с использованием MAX() и/или NOT EXISTS. – joop

ответ

5

Вы можете использовать LEFT JOIN, чтобы сделать это; используйте дополнительное левое соединение с нулевой проверкой, чтобы убедиться, что не существует новой даты сопоставления;

SELECT d.`date`, c.`count` 
FROM dates d 
LEFT JOIN counts c ON d.`date` >= c.`date` 
LEFT JOIN counts c2 ON d.`date` >= c2.`date` AND c.`date`<c2.`date` 
WHERE c2.`date` IS NULL; 

An SQLfiddle to test with.

1

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

select d.date, 
     (select c.count 
     from counts c 
     where d.date >= c.date 
     order by c.date desc 
     limit 1 
     ) as count 
from dates d; 

Это должно быть даже относительно эффективным, если у вас есть индекс по counts(date, count).

Смежные вопросы