簡體   English   中英

Mysql從表中選擇每個唯一location_id和產品的日期最大值

[英]Mysql Select from table where a date is max for each unique location_id AND product

我有一張表 - 記錄 - 看起來像這樣

id | location_id | product | stock | date  
===|=============|=========|=======|======
1  | Bakery 1    |  cake   |  21   | 2
2  | Bakery 1    |  bread  |  23   | 2
3  | Bakery 2    |  cake   |  21   | 2
4  | Bakery 2    |  bread  |  21   | 2
5  | Bakery 1    |  cake   |  21   | 3
6  | Bakery 1    |  bread  |  23   | 3
7  | Bakery 2    |  cake   |  21   | 3
8  | Bakery 2    |  bread  |  21   | 3
9  | Bakery 1    |  cake   |  21   | 4
10 | Bakery 1    |  bread  |  23   | 4
11 | Bakery 2    |  bread  |  23   | 4

對於每個位置和每個產品,我想選擇具有最高日期值的行。 這將是什么樣子

id | location_id | product | stock | date  
===|=============|=========|=======|======
7  | Bakery 2    |  cake   |  21   | 3
9  | Bakery 1    |  cake   |  21   | 4
10 | Bakery 1    |  bread  |  23   | 4
11 | Bakery 2    |  bread  |  23   | 4

如何使用一個查詢執行此操作? 我可以循環遍歷所有位置和所有產品並構建查詢但是它的時間和內存消耗更多?

select r1.*
from records r1
join
(
  select location_id, product, max(date) as date
  from records
  group by location_id, product
) r2 on r1.location_id = r2.location_id 
    and r1.product = r2.product
    and r1.date = r2.date

如果滿足以下條件,則可以使用id列非常有效地完成此任務

  1. 你的id列是自動增量的
  2. date列表示當前日期:即,您永遠不會插入回溯記錄。
  3. 你沒有更新date

如果這些條件為真,則表示唯一標識符id可用作每條記錄的非唯一值date的代理。 具有更高date值的行始終保證具有更高的id值。

如果您可以這樣做,您可以使您的查詢執行得非常好。

首先,創建一個子查詢,以獲取每個位置和產品組合的最新行的id

SELECT MAX(id)
  FROM records
 GROUP BY location_id, date

然后使用該組id值從表中提取正確的記錄

SELECT *
  FROM records
 WHERE id IN (
                SELECT MAX(id)
                 FROM records
                GROUP BY location_id, date
              )
ORDER BY location_id, product 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM