Присоединяйтесь к таблицам на ближайшую дату в прошлом, в MySQL - PullRequest
4 голосов
/ 20 июля 2010

У меня есть sqlite-запрос, который я пытаюсь написать. У меня есть две таблицы:

Таблица A (продажа): Я бы продажи дата

Таблица B (цели): Я бы Цель дата

Я выбираю из таблицы А вот так: ВЫБЕРИТЕ id, продажи, дату ИЗ таблицы A

Теперь о "хитрой" части. Мне нужно присоединить TableB к запросу, потому что мне нужно поле цели в TableB для каждой строки в TableA. Таблица B содержит цели только на некоторые даты , тогда как Таблица A содержит все даты . Поэтому я не могу просто использовать TableA.date = TableB.date

Вместо этого для каждой строки в Таблице A мне нужно взять цель из Таблицы B на дату, ближайшую в прошлом к ​​дате в Таблице A. Надеюсь, я смог объяснить, что мне нужно. Не могу понять, как это сделать ..

Ответы [ 3 ]

9 голосов
/ 20 июля 2010
SELECT a.id, a.sales, a.date, (SELECT TOP 1 Goal 
                               FROM TableB b WHERE b.date < a.date
                               ORDER BY b.date DESC) As Goal
FROM TableA a

Отключение ближайшей даты в прошлом.

1 голос
/ 20 июля 2010

«Ровно равная дата» будет объединением в поле даты.(Как в ответе Эша)

«Ближайшая дата», вероятно, должна читаться как «ближайшая дата в будущем» или «ближайшая дата в прошлом» (или, возможно, нет).В этом случае вы можете использовать подзапрос с оператором WHERE, сравнивающим даты (<или>)

Если «ближайшая дата» есть и в прошлом, и в настоящем, я, вероятно, закодирую ее, написав хранимую процедуру, котораясоздает вспомогательную таблицу, содержащую наиболее релевантную «близкую дату» (из B) для каждой даты в таблице А. Таким образом, я бы лучше контролировал поведение процедуры, и в будущем это было бы легче изменить.

Оптимизация производительности всегда может произойти позже.

0 голосов
/ 20 июля 2010

Просто возьмите декартово произведение и отфильтруйте неинтересные строки.В основном:

select a.*, b.*
from a, b
where
not exists (
  select null
  from b b2
  where abs(b2.date - a.date) < abs(b.date - a.date)
)

Я не знаю, поддерживает ли SQLite это, жестко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...