2016-10-27 16 views
1

私は1つのMySQLテーブルを販売しています。私は市場の各商品の平均価格が5分ごとに記録された2番目のテーブルを持っています。これらは価格が分単位で変化する可能性があります。2つのテーブルを結合して最も近いタイムスタンプを見つけよう

販売前と販売後の両方で販売時間に最も近い販売された各商品について、表2から市場価格を取得する必要があります。

私はそれを2つの別々のクエリとして販売前の価格と価格に分割しようとしていました。私がこれまでに得たことは以下の通りです。しかし、それが問題になるのは、マーケットを注文するだけなのです。行が設定された後です。 GROUP BYステートメントがsales.idごとに一番上の行を選ぶ前にmarket.timeで注文する必要があります。基本的には、販売されたアイテムのリストにある最古の価格を返します。その後、テーブル全体がその時間に注文されます。

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

関連する問題