oracle 用分析函數ROW_NUMBER() OVER() 不用group by,得到最大時間的數據,主鍵id

我的項目需求,按DETECTOR_ID進行分組 找到最大時間的數據。我的思路是分組獲取最大時間數據的唯一uuid再自關聯查出

原先獲取最大時間sql:

SELECT
MAX(RECORD_ID)   AS RECORD_ID       ,
MAX(RECORD_DATE) AS  RECORD_DATE ,
DETECTOR_ID
FROM TRH_DETECTOR_RECORD
GROUP BY DETECTOR_ID;

但是ID 不是當前最大時間的Id而是最大的Id

現在改成
SELECT B.RN, B.DETECTOR_ID, B.RECORD_ID, B.RECORD_DATE
  FROM (SELECT ROW_NUMBER() OVER(PARTITION BY A.DETECTOR_ID ORDER BY A.RECORD_DATE DESC) RN,
               A.*
          FROM TRH_DETECTOR_RECORD A) B
 WHERE B.RN = 1;

 

接下來介紹 ROW_NUMBER() OVER()  用法及其定義

語法格式:row_number() over(partition by 分組列 order by 排序列 desc)

一個很簡單的例子

1,先做好準備

create table test1(
       id varchar(4) not null,
       name varchar(10) null,
       age varchar(10) null
);

select * from test1;

insert into test1(id,name,age) values(1,'a',10);
insert into test1(id,name,age) values(1,'a2',11);
insert into test1(id,name,age) values(2,'b',12);
insert into test1(id,name,age) values(2,'b2',13);
insert into test1(id,name,age) values(3,'c',14);
insert into test1(id,name,age) values(3,'c2',15);
insert into test1(id,name,age) values(4,'d',16);
insert into test1(id,name,age) values(5,'d2',17);

 

2,開始使用之~

select t.id,
       t.name,
       t.age,
       row_number() over(partition by t.id order by t.age asc) rn
  from test1 t

結果:

  id   name    age    rn

  1   a    10   1
  1   a2    11    2
  2   b    12   1
  2   b2    13   2
  3   c    14   1
  3   c2    15    2
  4   d    16   1
  5   d2   17   1

 

3,進一步排序

select * from (select t.id,
       t.name,
       t.age,
       row_number() over(partition by t.id order by t.age asc) rn
  from test1 t) where rn < 2

結果:

   id    name   age    rn

  1   a   10   1
  2   b   12   1
  3   c   14   1
  4   d   16   1
  5   d2   17    1

 

4,總結

  工作半年的經驗來看,基本上row_number() over()這個函數主要用在各種數據統計的sql中,感覺比group by好用的都,可以在一個查詢中對多列數據進行分組,尤其在多表關聯查詢中,row_number() over()還是非常便捷的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章