2016-10-27 2 views
1

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

Мне нужно получить рыночную цену из таблицы 2 за каждый проданный товар, который наиболее близок к времени продажи как до, так и после продажи.

Я пытался разделить его на получение цены до и после продажи в виде 2 отдельных запросов. То, что я до сих пор, ниже. Проблема с ним, хотя это только заказывает market.time после того, как строки были установлены. Мне нужно его заказывать на market.time, прежде чем оператор GROUP BY выберет верхнюю строку на sales.id (надеюсь, это имело смысл). В основном это возвращает самую раннюю цену, указанную для предмета, который был продан, а затем вся таблица упорядочена к тому времени.

SELECT sales.id, sales.price, sales.time, sales.item_id, market.time, market.price, 
FROM sales_table sales 
INNER JOIN market_table market ON market.item_id = sales.item_id 
WHERE market.time < sales.time 
GROUP BY sales.id 
ORDER BY market.time DESC; 

продаж таблица

| id | price|   time     | item_id | 
-------------------------------------------------------- 
| 1 |  0.5 | 2006-10-05 11:55:44  | 5  | 
| 2 |  1.1 | 2007-10-07 12:34:17  | 5  | 
| 3 |  0.4 | 2008-10-09 08:19:36  | 9  | 
| 4 |  5.8 | 2010-10-13 04:28:14  | 1  | 

настольный рынок

| id | price|   time     | item_id | 
-------------------------------------------------------- 
| 1 |  0.5 | 2006-10-05 11:50:00  | 1  | 
| 2 |  1.1 | 2006-10-05 11:55:00  | 1  | 
| 3 |  0.4 | 2008-10-09 02:20:00  | 2  | 
| 4 |  5.8 | 2010-10-09 04:25:00  | 2  | 

желаемого результата

| s_id | s_price|  sales_time  | item_id| market_time  |m_price 
---------------------------------------------------------------------------- 
| 1 | 0.5 | 2006-10-05 11:55:44 | 5  | 2006-10-05 11:55:00| 0.5 
| 2 | 1.1 | 2007-10-07 12:34:17 | 5  | 2007-10-07 12:30:00| 1.2 
| 3 | 0.4 | 2008-10-09 08:19:36 | 9  | 2008-10-09 08:15:00| 0.45 
| 4 | 5.8 | 2010-10-13 04:28:14 | 1  | 2010-10-13 04:25:00| 6.0 

, что я в настоящее время получаю от моего запроса выше

| s_id | s_price|  sales_time  | item_id| market_time  |m_price 
---------------------------------------------------------------------------- 
| 1 | 0.5 | 2006-10-05 11:55:44 | 5  | 2001-01-01 00:00:00| 1.0 
| 2 | 1.1 | 2007-10-07 12:34:17 | 5  | 2002-06-01 09:15:00| 0.8 
| 3 | 0.4 | 2008-10-09 08:19:36 | 9  | 2002-08-14 15:30:00| 0.2 
| 4 | 5.8 | 2010-10-13 04:28:14 | 1  | 2003-10-01 12:00:00| 5.2 
+0

См http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very -simple-sql-query – Strawberry

+0

@Strawberry Ouch ... Я рад, что это не мой вопрос ;-) –

+1

@TimBiegeleisen Я все еще напряженно тружусь над тем, что, если я скажу это достаточно часто, сообщение может в конечном итоге пройти кому-то. – Strawberry

ответ

0

Пожалуйста, используйте номер строки.

select id, time, price, time, price from (
    SELECT sales.id, sales.time, sales.price, market.time, market.price, row_number() over (partition by sales.id order by ABS(DATEDIFF(SECOND, market.time, sales.time))) as r 
    FROM sales_table sales 
    INNER JOIN market_table market ON market.item_id = sales.item_id 
) as t 
where t.r = 1 
ORDER BY market.time DESC; 
+0

Вопрос о MySQL – Strawberry

+0

это, я было интересно, почему я получал ошибки вокруг части row_number. – mehigasf

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