oracle找到連續3條記錄相同的

2021-10-05 02:21:13 字數 2185 閱讀 7394

編寫乙個 sql 查詢,查詢所有至少連續出現三次的數字。

±—±----+

| id | num |

±—±----+

| 1 | 1 |

| 2 | 1 |

| 3 | 1 |

| 4 | 2 |

| 5 | 1 |

| 6 | 2 |

| 7 | 2 |

±—±----+

我的解題思路受到上道題影響,跟標準答案一模一樣,但是效率並不是很高。

select

distinct t1.num consecutivenums

from logs t1,logs t2,logs t3

where t1.id = t2.id -

1and t2.id = t3.id -

1and t1.num = t2.num

and t1.num = t3.num

;

另外看到了乙個第二個答案,也不太理解,就抄過來了,學習一下。

搜尋了一下lead和lag函式的用法,具體可見lead和lag用法

基本上就是,選出了前乙個id的num作為lead,後乙個id的num作為lag,然後只要lead=lag=自己,就可以了。

lag(num) 明顯示省略了offset,offset預設就為1。

可見lag和lead方法

select

distinct num as consecutivenums from

(select

id,num,

lag(num)

over

(order

by id)

as lag,

lead(num)

over

(order

by id)

as lead

from

logs

)where num = lag and num = lead

還有第三個答案,還挺有意思的哈,又是mysql的變數使用方式。

#①首先遍歷一遍整張表,找出每個數字的連續重複次數

#具體方法為:

#初始化兩個變數,乙個為pre,記錄上乙個數字;乙個為count,記錄上乙個數字已經連續出現的次數。

#然後呼叫if()函式,如果pre和當前行數字相同,count加1極為連續出現的次數;如果不同,意味著重新開始乙個數字,count重新從1開始。

#最後,將當前的num數字賦值給pre,開始下一行掃瞄。

select 

num,

#當前的num 數字if(

@pre

=num,

@count :=

@count+1

,@count :=1)

as nums,

#判斷 和 計數

@pre:=num #將當前num賦值給pre

from logs as l ,

(select

@pre:=

null

,@count:=1)

as pc #這裡需要別名

#上面這段**執行結果就是一張三列為num,count as nums,pre的表。

#②將上面表的結果中,重複次數大於等於3的數字選出,再去重即為連續至少出現三次的數字。

select

distinct num as consecutivenums

from

(select num,if(

@pre

=num,

@count :=

@count+1

,@count :=1)

as nums,

@pre:=num

from logs as l ,

(select

@pre:=

null

,@count:=1)

as pc

)as n

where nums >=

3;

#注意:pre初始值最好不要賦值為乙個數字,因為不確定賦值的數字是否會出現在測試表中。

Oracle取TOP N條記錄

在sql server裡面有top關鍵字可以很方便的取出前n條記錄,但是oracle裡面卻沒有top的使用,類似實現取出前n條記錄的簡單方法如下 方法1 利用row number函式 取出前5條記錄 selectnofrom selectrow number over orderbyno rno,n...

Oracle前10條記錄

在oracle怎樣查詢表中的top10條記錄呢?select from test where rownum 10 下面是關於rownum的介紹 rownum和row number over 的使用 rownum是oracle從8開始提供的乙個偽列,是把sql出來的結果進行編號,始終從1開始,常見的用...

oracle隨機查詢n條記錄

從table name表中隨機查詢3條記錄,如下 select from select from table name where 條件 order by trunc dbms random.value 1,7 temp where rownum 3 附 一 oracle trunc 函式的用法 t...