如何檢視連續幾天運算元量的最大記錄

2021-09-23 10:10:29 字數 2815 閱讀 5767

題目:求連續日期登入次數最大的使用者

登入時間裡面有詳細的時分秒資料,而我們的題目只要求連續的天數,所以使用datediff函式可以解決,

datediff(d,logintime,getdate()) as diffdate ,

有多個使用者都在登入,因此應該以使用者名為分割槽,登入時間為順序來計算rownumber,因此,就是下面的表示式:

row_number() over(partition by name order by logintime desc) as rn

關鍵問題來了,如何求得連續的登入情況?

如果是連續的記錄,那麼 diffdate- rn 肯定是相同的!

開始動手,先構造乙個表,插入初始資料:

複製**

/*求連續登入次數最多的使用者

*/create table userlogininfo(

id int identity primary key,

name varchar(50) not null,

logintime datetime not null)go

insert userlogininfo (name,logintime)

values(『zhang』,『2015-11-10 12:01:50』)

,(『li』,『2015-11-11 11:01:50』)

,(『wang』,『2015-11-9 11:01:50』);

goinsert userlogininfo (name,logintime) values

(『zhang』,『2015-11-11 12:01:50』),

(『li』,『2015-11-11 12:01:50』),

(『wang』,『2015-11-11 11:01:50』),

(『zhang』,『2015-11-12 12:01:50』),

(『li』,『2015-11-13 13:01:50』),

(『wang』,『2015-11-12 11:01:50』),

(『zhang』,『2015-11-13 12:01:50』),

(『li』,『2015-11-14 11:01:50』),

(『wang』,『2015-11-14 11:01:50』);

go複製**

然後用下面的sql得到結果:

複製**

select top 1

name,diffrn,count(diffrn)as logincount

from(

select name,diffdate,rn, (diffdate-rn) as diffrn

from(

select id,name,

datediff(d,logintime,getdate()) as diffdate ,

row_number() over(partition by name order by logintime desc) as rn

from userlogininfo

) t1

) t2

group by diffrn,name

order by logincount desc

複製**

答案是:

name diffrn logincount

zhang 14 4

如果注釋掉 top 1,我們就知道這個結果的由來了:

複製**

name diffrn logincount

zhang 14 4

li 13 3

wang 14 2

wang 15 1

li 14 1

wang 13 1

複製**

這個問題也可以衍生出 求連續登入的使用者,或者求連續登入15天的使用者(比如qq的簽到功能),是不是很熟悉呢?

實際上,上面這個查詢,遇到一天登入多次的情況下,統計是不準確的,例如,構造下面的測試資料:

view code

這時應該先去除某天的重複資料,才是正確的,所以查詢應該做如下改進:

複製**

select --top 1

name,diffrn,count(diffrn)as logincount

from(

select name,diffdate,rn, (diffdate-rn) as diffrn

from(

select name,

diffdate,

row_number() over(partition by name order by diffdate asc) rn

from (

select distinct name,datediff(d,logintime,getdate()) as diffdate

from userlogininfo

) t0

) t1

) t2

group by diffrn,name

order by logincount desc;

複製**

結果是:

複製**

name diffrn logincount

zhang 14 4

wang 14 2

li 13 2

li 14 2

li 48 2

li 411 2

li 774 2

wang 13 1

wang 15 1

複製**

結果符合我們的預期,算是完整的答案了。

ps:如果你經常會在程式中寫這樣複雜的sql,推薦你使用pdf.net sod框架的sql-map功能,將sql寫在配置檔案中,集中管理,並且方便跨資料庫移植。

如何檢視伺服器當前的併發訪問量

伺服器訪問人數可以通過命令 netstat pnt grep 80 列出,比如此時請求伺服器上乙個頁面,通過該命令可以檢視結果,後面的established表示伺服器正在被訪問,可以通過新增 wc l 統計數量,最終命令是 netstat pnt grep 80 wc l 此命令可以統計伺服器所有u...

如何檢視伺服器當前的併發訪問量

伺服器訪問人數可以通過命令 netstat pnt grep 80 列出 比如此時請求伺服器上乙個頁面,通過該命令可以檢視結果,後面的established表示伺服器正在被訪問,可以通過新增 wc l 統計數量,最終命令是 netstat pnt grep 80 wc l 此命令可以統計伺服器所有u...

如何檢視伺服器當前的併發訪問量

伺服器訪問人數可以通過命令 netstat pnt grep 80 列出 比如此時請求伺服器上乙個頁面,通過該命令可以檢視結果,後面的established表示伺服器正在被訪問,可以通過新增 wc l 統計數量,最終命令是 netstat pnt grep 80 wc l 此命令可以統計伺服器所有u...