Sql group by 分組取時間最新的一條數(shù)據(jù)(示例代碼)
項目場景:
數(shù)據(jù)庫:Oracle
表名:Test
字段名:Id、PId、Name、Time
需求:根據(jù)PId分組,1、取時間最新的一條數(shù)據(jù);2、取時間最早的一條數(shù)據(jù)。
示例代碼:
一、取時間最新的一條數(shù)據(jù)
1.取時間最新的記錄分組,允許重復(fù)
多條Time一樣的都是最新記錄
select * from test t where pid in ( select PId from Test t where time=(select max(time) from Test t1 where t1.PId=t.PId) group by Pid ) and time=(select max(time) from Test t1 where t1.PId=t.PId)
2.分組后取時間最新的記錄,不允許重復(fù)
如果Id是序列自增長可以使用max(id),多條Time一樣的只取一條
/*注意Id必須使用聚合函數(shù)Max*/ SELECT max(Id), Pid, MAX(Time) as MaxTime FROM Test GROUP BY Pid
3.使用ROW_NUMBER()窗口函數(shù),不允許重復(fù)
如果Id是uuid類型無法使用max(id)的解決辦法,使用ROW_NUMBER()窗口函數(shù)
在這個查詢中,我們使用了ROW_NUMBER()窗口函數(shù),并按照Pid進(jìn)行分組。然后,我們按照Time降序排序,以便最新的時間排在前面。最后,在外部查詢中,我們選擇排名為1的記錄,即每個分組中時間最新的記錄。
/*降序是為了where KeyId=1 (1是固定值第一條),如果升序由于不知道每組多少條where中KeyId就無法過濾了*/ select * from ( select row_number() over(partition by Pid order by Time desc) as KeyId ,* from Test ) d where KeyId=1
二、取時間最早的一條數(shù)據(jù)
這個查詢使用了窗口函數(shù)MIN來獲取每個分組中的最小時間值(min_time)。然后,在外部查詢中,通過比較Time和min_time來過濾出每個分組中時間最早的數(shù)據(jù)行。
SELECT * FROM ( SELECT *, MIN(Time) OVER (PARTITION BY Pid) AS min_time FROM Test ) t WHERE Time = min_time;
到此這篇關(guān)于Sql group by 分組取時間最新的一條數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Sql group by 分組取數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SQL?Group?By分組后如何選取每組最新的一條數(shù)據(jù)
- mysql通過group?by分組取最大時間對應(yīng)數(shù)據(jù)的兩種有效方法
- python?DataFrame數(shù)據(jù)分組統(tǒng)計groupby()函數(shù)的使用
- MySQL數(shù)據(jù)庫分組查詢group by語句詳解
- pandas數(shù)據(jù)分組groupby()和統(tǒng)計函數(shù)agg()的使用
- 基于mysql實現(xiàn)group by取各分組最新一條數(shù)據(jù)
- 利用Pandas和Numpy按時間戳將數(shù)據(jù)以Groupby方式分組
相關(guān)文章
MySQL的MRR(Multi-Range Read)優(yōu)化原理解析
MRR優(yōu)化是MySQL中一種重要的查詢優(yōu)化技術(shù),它通過減少磁盤I/O的隨機(jī)性和提高緩存效率,顯著提升了查詢性能,這篇文章主要介紹了MySQL的MRR(Multi-Range Read)優(yōu)化原理詳解,需要的朋友可以參考下2024-08-08mysql-8.0.30壓縮包版安裝和配置MySQL環(huán)境過程
該文章介紹了如何在Windows系統(tǒng)中下載、安裝和配置MySQL數(shù)據(jù)庫,包括下載地址、解壓文件、創(chuàng)建和配置my.ini文件、設(shè)置環(huán)境變量、初始化MySQL服務(wù)、啟動服務(wù)以及修改root用戶密碼等步驟2025-01-01