編寫乙個 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...