![](/img/trans.png)
[英]How to SELECT rows with MIN(DateTime column), GROUP by another column and DISTINCT by another column in SQL?
[英]SQL selecting the rows with latest datetime group by another column
我有一個數據庫,其中包含許多看起來像這樣的表(簡化了一點)
id | item_id | type_id | processed_time | other cols
------|-----------|---------|----------------------|-------------
1 | 1 | 1 | 2015-03-17 00:11:22 | ...
2 | 1 | 1 | 2015-03-17 00:22:33 | ...
3 | 1 | 2 | 2015-03-17 00:11:22 | ...
4 | 1 | 2 | 2015-03-17 00:33:44 | ...
5 | 2 | 1 | 2015-03-17 00:22:33 | ...
6 | 2 | 1 | 2015-03-17 00:11:22 | ...
7 | 2 | 2 | 2015-03-17 00:22:33 | ...
8 | 2 | 2 | 2015-03-17 00:33:44 | ...
... | ... | ... | ... | ...
我正在嘗試執行許多查詢,但是它們都遵循相同的主題:為按type_id分組的特定項目選擇所有最新(處理時間(日期時間))行。
因此,在表格示例中,希望item_id = 1得到:
id | item_id | type_id | processed_time | other cols
------|-----------|---------|----------------------|-------------
2 | 1 | 1 | 2015-03-17 00:22:33 | ...
4 | 1 | 2 | 2015-03-17 00:33:44 | ...
... | ... | ... | ... | ...
除此之外,我想對所有項目IE執行此查詢:
id | item_id | type_id | processed_time | other cols
------|-----------|---------|----------------------|-------------
2 | 1 | 1 | 2015-03-17 00:22:33 | ...
4 | 1 | 2 | 2015-03-17 00:33:44 | ...
5 | 2 | 1 | 2015-03-17 00:22:33 | ...
8 | 2 | 2 | 2015-03-17 00:33:44 | ...
... | ... | ... | ... | ...
我遇到的主要問題是,我不確定在獲取最近的處理時間后如何獲取ID。 我一直朝着類似SELECT id, MAX(processed_time) FROM item GROUP BY type_id
之類的子查詢的方向進行查詢SELECT id, MAX(processed_time) FROM item GROUP BY type_id
但是該查詢中的id
顯然是不確定的,我不確定如何獲取該值。
(請注意,處理時間不是唯一的)
因為您的描述和第二個示例輸出不匹配,所以有些混亂。 您似乎想在item_id中找到最新的type_id。 在這種情況下,從您顯示的數據樣本中,將有四行-兩行用於item_id = 1:type_id 1和2,兩行用於item_id = 2:type_id 1和2。
如果真是這樣,那么簡單的相關子查詢將是您最好的方法之一。
select *
from Source s
where s.processed_time =(
select Max( processed_time )
from Source
where item_id = s.item_id
and type_id = s.type_id );
哪個返回:
id item_id type_id processed_time
-- ------- ------- -------------------
2 1 1 2015-03-17 00:22:33
4 1 2 2015-03-17 00:33:44
5 2 1 2015-03-17 00:22:33
8 2 2 2015-03-17 00:33:44
如果在(item_id,type_id,processed_time)上有索引,這將有所幫助。
如果這不是您想要的,請添加一些描述。
SELECT t.*
FROM table t
WHERE NOT EXISTS ( SELECT 'a'
FROM table t2
WHERE t2.item_id = t.item_id
AND t2.type_id = t.type_id
AND t2.processed_time > t.processed_time
AND t2.id > t.id -- (note that processed_time is not unique)
)
返回具有相同item_id和type_id的最后一項
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.