4

私は在庫管理システムを構築しており、各製品の残高 (更新されるたびに) を次の表に保存することにしました。

+------------+--------------+---------+------+
| Product_id | Warehouse_id | Balance | Date |
+------------+--------------+---------+------+

例:

スタッフは、warehouse_id 5 の product_id 123 に 10 個を追加します

+------------+--------------+---------+-------------+
| Product_id | Warehouse_id | Balance | Date        |
+------------+--------------+---------+-------------+
| 123        | 5            | 10      | 2013-09-16  |
+------------+--------------+---------+-------------+

スタッフは次に、warehouse_id 5 の製品 234 に 3 個を追加し、warehouse_id 5 の 123 に 5 個を追加します。

+------------+--------------+---------+-------------+
| Product_id | Warehouse_id | Balance | Date        |
+------------+--------------+---------+-------------+
| 123        | 5            | 10      | 2013-09-16  |
| 234        | 5            | 3       | 2013-09-18  |
| 123        | 5            | 15      | 2013-09-21  |
+------------+--------------+---------+-------------+

※日付欄にご注意ください

次に、さらにいくつかの行を追加します

+------------+--------------+---------+-------------+
| Product_id | Warehouse_id | Balance | Date        |
+------------+--------------+---------+-------------+
| 123        | 5            | 10      | 2013-09-16  |
| 234        | 5            | 3       | 2013-09-18  |
| 123        | 5            | 15      | 2013-09-21  |
| 123        | 5            | 18      | 2013-09-24  |
| 234        | 5            | 10      | 2013-09-26  |
| 123        | 5            | 22      | 2013-09-29  |
+------------+--------------+---------+-------------+

2013 年 9 月 25 日の時点でのすべての製品の残高を取得するクエリを実行するにはどうすればよいですか?

つまり、次の結果が必要です。

+------------+--------------+---------+-------------+
| Product_id | Warehouse_id | Balance | Date        |
+------------+--------------+---------+-------------+
| 234        | 5            | 3       | 2013-09-18  |
| 123        | 5            | 18      | 2013-09-24  |
+------------+--------------+---------+-------------+

つまり、product_id ごとに最新の行 (日付順) が必要です。

どんな助けでも大歓迎です!

4

3 に答える 3

2

製品のバランスが倉庫ごとに維持されていると仮定すると、次のようにすることができます

SELECT t.product_id, t.warehouse_id, t.balance, t.date
  FROM table1 t JOIN 
(
  SELECT warehouse_id, product_id, MAX(date) date
    FROM table1
   WHERE date <= '2013-09-25'
   GROUP BY warehouse_id, product_id
) q
    ON t.warehouse_id = q.warehouse_id
   AND t.product_id = q.product_id
   AND t.date = q.date

出力:

| | 製品 ID | WAREHOUSE_ID | バランス | 日付 |
|------------|--------------|---------|----------- -|
| | 234 | 5 | 3 | 2013-09-18 |
| | 123 | 5 | 18 | 2013-09-24 |

これがSQLFiddleのデモです

于 2013-09-16T10:49:14.267 に答える
0

クエリ:

SQLFIDDLE例

  SELECT *
  FROM table1 t 
  WHERE t.`Date` = (SELECT MAX(t2.`Date`)
                  FROM Table1 t2
                  WHERE t2.`Date` <= '2013-09-25'
                  AND t2.product_id = t.product_id)
于 2013-09-16T11:01:16.880 に答える