問題描述
存在乙個表,只有number一列,資料是n行非完全連續的資料,求這n行資料中所有的連續段
示例如:表中共10行資料,分別為數字1,2,3,5,6,7,9,10,11,12。則按照規則求得結果為1-3為一段,5-6為一段,9-12為一段
思路1、按number大小排序,並從小到大標上序號rank_id2、增加差值列(d_value=rand_id-number)3、按d_value分組,求number的最小值、最大值,即得連續段的開始數值、結束數值
sql demo
建表
drop table if exists table_test;造數create table table_test (
number int comment '數字'
);
truncate table table_test;求值insert into table_test
values(1),(2),(3),(5),(6),(7),(9),(10),(11),(12);
selectd_value,min(number) as start_num,max(number) as end_num
from
(select
number-row_number() over (order by number) as d_value
,number
from table_test
) tgroup by d_value;
大Sql的切分執行
以前一直覺得sql應該減少傳遞次數,減少和資料庫的通訊,這樣可以提高效率。但現在發現,凡事都有個度的問題,由於業務需要一次性插入大概4000條資料,如果有併發操作,很容易就造成sql超時錯誤。於是就寫了乙個能夠拆分大sql執行的函式。執行大sql語句,傳入為stringbuilder以提高效率。pu...
sql 180 連續出現的數字
編寫乙個 sql 查詢,查詢所有至少連續出現三次的數字。id num 1 1 2 1 3 1 4 2 5 1 6 2 7 2 例如,給定上面的 logs 表,1 是唯一連續出現至少三次的數字。consecutivenums 1 這道題解法練習一下多表連線的寫法,雖然這種方式效率很低 select d...
連續出現的數字
表 logs 編寫乙個 sql 查詢,查詢所有至少連續出現三次的數字。返回的結果表中的資料可以按任意順序排列。查詢結果格式如下面的例子所示 解法一 使用視窗函式的偏差函式完美實現。可以這樣理解 將num複製兩列num1和num2,然後num1整體向上移動一行,num2整體向上移動兩行,如下 所以只要...