mysql 取得表中重複值之間的間隔以及最大間隔

2021-06-16 23:29:38 字數 3606 閱讀 8598

今天在論壇上看到乙個帖子,我覺得挺有意思,帖子如下:

雖說我現在在mysql方面能力有限,但也想嘗試一把,想把它搞出來,經過我的不懈努力,算是有個結果了,可以給自己乙個交代了,

鑑於目前的我是個mysql菜鳥,看著回帖子的都是版主,大拿級人物,沒敢和人家平起平坐,所以我沒把自己的小小成果以帖子的形式回給人家,還是放到自己小窩裡供大家和自己分享吧

以下為我做的實驗步驟:

mysql> create table test(id varchar(10));

query ok, 0 rows affected (0.04 sec)

mysql> insert into test(id) values('a');

query ok, 1 row affected (0.00 sec)

mysql> insert into test(id) values('b');

query ok, 1 row affected (0.00 sec)

mysql> insert into test(id) values('c');

query ok, 1 row affected (0.00 sec)

mysql> insert into test(id) values('a');

query ok, 1 row affected (0.00 sec)

mysql> insert into test(id) values('d');

query ok, 1 row affected (0.00 sec)

mysql> insert into test(id) values('e');

query ok, 1 row affected (0.00 sec)

mysql> insert into test(id) values('f');

query ok, 1 row affected (0.00 sec)

.

..

mysql> insert into test(id) values('o');

query ok, 1 row affected (0.00 sec)

mysql> insert into test(id) values('a');

query ok, 1 row affected (0.00 sec)

mysql> select * from test;

+------+

| id   |

+------+

| a    |

| b    |

| c    |

| a    |

| d    |

| e    |

| f    |

| a    |

| g    |

| h    |

| i    |

| a    |

| j    |

| k    |

| l    |

| m    |

| n    |

| o    |

| a    |

+------+

19 rows in set (0.00 sec)

mysql> set @rownum=0;                                   --初始化變數rownum,初始值為0

query ok, 0 rows affected (0.00 sec)

mysql> set @rownum1=0;                                 --初始化變數rownum1,初始值為0

query ok, 0 rows affected (0.00 sec)

--查詢表中重覆記錄a的各個間隔

mysql> select c.rownum,c.id,min(c.rownum-d.rownum)-1 from (select b.rownum,b.id from (select @rownum:=@rownum+1 as rownum,id from test) b where b.id='a') c

-> inner join (select e.rownum,e.id from (select @rownum1:=@rownum1+1 as rownum,id from test) e where e.id='a') d on (c.rownum>d.rownum)

-> group by c.rownum,c.id;

+--------+------+--------------------------+

| rownum | id   | min(c.rownum-d.rownum)-1 |

+--------+------+--------------------------+

|      4 | a    |                        2 |

|      8 | a    |                        3 |

|     12 | a    |                        3 |

|     19 | a    |                        6 |

+--------+------+--------------------------+

4 rows in set (0.00 sec)

--查詢表中重覆記錄a的最大間隔

mysql> select max(f.z) from (select min(c.rownum-d.rownum)-1  z from (select b.rownum,b.id from (select @rownum:=@rownum+1 as rownum,id from test) b where b.id='a') c

-> inner join (select e.rownum,e.id from (select @rownum1:=@rownum1+1 as rownum,id from test) e where e.id='a') d on (c.rownum>d.rownum)

-> group by c.rownum,c.id) f;

+----------+

| max(f.z) |

+----------+

|        6 |

+----------+

1 row in set (0.00 sec)

mysql> 

解釋說明:

要是只是按帖子中說的乙個字段,無法取得重覆記錄之間的間隔,同時也就不能求出最大間隔

所以,需要構造乙個虛擬列(rownum),用這列記錄表中記錄的行號。

設定兩個臨時變數,初始值設定為0: set @rownum=0;   以及 set @rownum1=0;

讓@rownum自加1並賦值給自己作為行號

min(c.rownum-d.rownum)  為的是讓相鄰兩個重複值之間相減

min(c.rownum-d.rownum)-1  取得間隔

max(f.z) 取得最大間隔

語句看起來挺複雜,其實就是做了個自連線

mysql刪除表中重複值

工作中遇到這麼個需求,有個 eh 表沒有唯一索引,當表中有一大堆資料後,又需要建個唯一索引,而這個表中還很多重複值,問我咋辦?一句話形容就是 表中重複值太多,如何去重。舉個白痴例子 1.建表a create table a id int,name char 10 2.插入資料 id name 1 a...

陣列中重複的值

找出陣列中重複的數字。在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3 限制 2 n 100000 下...

如何在ng if中取得ng model的值

來北京工作快乙個月了吧,專案是我感興趣的angular框架的,遇到和解決了一些坑。今個遇到的都是定義域的問題,首先是directive復用,scope衝突,需要配置scope引數,然後就是ng if會開闢一塊定義域 這也是ng if與ng show的一大區別 話不多說,上 一看便知。如何在ng if...