題目:求連續日期登入次數最大的使用者
登入時間裡面有詳細的時分秒資料,而我們的題目只要求連續的天數,所以使用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...