Объединить таблицы с заданными датами - PullRequest
0 голосов
/ 01 апреля 2012

Я пытаюсь объединить две таблицы, и я хочу наименьший идентификатор, где дата из одной таблицы больше, чем дата из другой таблицы. Я думаю, что это легкая задача, но она меня устраивает.

Вот моя наивная попытка:

select table1.id, MIN(table2.id)

FROM table1
   INNER JOIN table2
     ON table2.id = table1.id

WHERE table1.date > table2.date

Это не работает, потому что, когда дата в таблице1 больше таблицы2, она объединяет все идентификаторы, а не только те, которые больше, чем дата. Это означает, что он возвращает наименьший идентификатор, несмотря ни на что.

Спасибо

РЕДАКТИРОВАТЬ ДЛЯ ЯРКОСТИ:

Продукт

id | price_date
---------------
 1 | 2011-01-02

Цена

id | fid | price_date
---------------
 1 |  1  | 2011-01-01
 2 |  1  | 2012-01-01

Итак, я хочу вернуться

product.id | price.id
---------------------
    1      |   1

Ответы [ 3 ]

1 голос
/ 01 апреля 2012

Это может быть то, что вы ищете.

select table1.id, 
       table1.date, 
       MIN(table2.date) Table2MinDate, 
       MIN(table2.id) Table2SmallestID
FROM table1
   INNER JOIN table2
     ON table1.date < table2.date
group by table1.id, table1.date
order by 1, 2

Я твердо верю, что должно быть условие соединения между table1 и table2, но это не может быть id, потому что запрос минимального идентификатора из table2 будетне имеет смысла.Он всегда будет иметь то же значение, что и идентификатор из таблицы 1.

Вы можете проверить Sql Fiddle

0 голосов
/ 01 апреля 2012

Я не уверен, что полностью понимаю, чего вы пытаетесь достичь - я предполагаю, что вы хотите вернуть min () для table2 для каждой строки в table1, где table1.date> table2.date. В этом случае вы можете использовать дополнительный выбор:

SELECT table1.id, (SELECT min(id) FROM table2 WHERE table1.date > table2.date) 
FROM table1
   INNER JOIN table2
     ON table2.id = table1.id AND table1.date > table2.date
0 голосов
/ 01 апреля 2012

Мне не очень нравится это, кажется немного грубой силой. Но это тот результат, который вы ищете?

РЕДАКТИРОВАТЬ, чтобы соответствовать образцу данных:

select id AS product_id
      ,(select min(id)
          from price
          where fid = p.id
            and price_date <= p.price_date
       ) AS price_id
  from product p

РЕДАКТИРОВАТЬ2: С примерами данных, показывающих отношение fk, ответ Никола является лучшим решением:

select p.id AS product_id
      ,MIN(x.id) AS price_id
  from product p
      ,price x
  where x.fid = p.id
    and x.price_date <= p.price_date
  group by p.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...