簡體   English   中英

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.

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