『壹』 sql查詢登陸過次數超過10次的用戶
select playerid,count(*) from userlogin group by playerid having count(*)>10
『貳』 近七天內用戶登錄次數sql語句怎麼寫
使用union all合並一個最近七天且統計為0的查詢,利用group by 日期天來統計真實數據,最外層包一個sum求和即可。
『叄』 sql求連續登錄天數
1.使用,第一個作業(以日期為鍵的映射,用戶組輸出。縮減設計: 內部構造一個大小為 n 的列表(作為一個隊列) ,啊(日期是有序的,從小到大)
『肆』 sql面試題1
【1】騰訊面試題
table_A ( 用戶userid和登錄時間time)求連續登錄3天的用戶數
https://www.cnblogs.com/ikww/p/12012831.html
【SQL】查詢連續登陸7天以上的用戶
查詢7天連續登陸用戶這個問題很經典,解決方法也有很多,這里我講一下筆者的方法,希望對大家有幫助。
具體思路:
1、因為每天用戶登錄次數可能不止一次,所以需要先將用戶每天的登錄日期去重。
2、再用row_number() over(partition by _ order by _)函數將用戶id分組,按照登陸時間進行排序。
3、計算登錄日期減去第二步驟得到的結果值,用戶連續登陸情況下,每次相減的結果都相同。
4、按照id和日期分組並求和,篩選大於等於7的即為連續7天登陸的用戶。
表信息如下圖
第一步:用戶登錄日期去重
1select DISTINCT date(date) as 日期,id from orde;
結果為:
第二步:用row_number() over()函數計數
1select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from orde)a;
結果為:
第三步:日期減去計數值得到結果
1select *,date(日期)-cum as 結果 from (select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from orde)a)b;
結果:
第四步:根據id和結果分組並計算總和,大於等於7的即為連續登陸7天的用戶
1select id,count(*) from (select *,date(日期)-cum as 結果 from (select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from orde)a)b)c GROUP BY id,結果 having count(*)>=7;
結果為:
用了多次嵌套查詢,最終得到我們需要的結果。
01
01.還原題目場景 - 建表
select*fromtmp.tmp_last_3_day;
02
02.解決問題關鍵 - 分析
03
03.見證奇跡的時刻 - 實現
連續3天登錄的用戶id sql如下:
我們再來看下結果:
04
04.面試反思總結 - 升華
現在看來,其實也不難嘛!思路很重要,有了思路,問題自然迎刃而解(此處有掌聲)。。ps:六師妹說今晚的加雞腿~哈哈
05
05.條條大路通羅馬
其實,方法有很多,上面只是選了一種技巧性比較強的一種。下面也是一種不錯的方法,大佬們肯定還有其他實現方式,歡迎小夥伴們右下角點[在看]評論留言,一起討論,一起進步 ~ go go go ...
【2】滴滴面試題
學生表:tb_student(name:學生姓名,id:學號,class:班級,in_time:入學時間,age:年齡,sex:性別,major:專業)
學生成績表:tb_score(id:學號,course:課程,score:分數)
(1)篩選出2017年入學的「計算機」專業年齡最小的10位同學名單(姓名、學號、班級、年齡)
(2)統計每個班同學各科成績平均分大於80分的人數和人數佔比
select a.class,
count(case when a.avg_score>80 then 1 else null end) as '人數'
count(case when a.avg_score>80 then 1 else null end)/count(a.id) as '人數佔比'
from
(select st.class,sc.id,avg(sc.score) as avg_score
from tb_student st
inner join tb_score sc
on st.id=sc.id
group by 1)a
(1)select st.name,st.id,st.class,st.age
from tb_student st
inner join tb_score sc
on st.id=sc.id
where year(st.in_time)='2017'
and major='計算機'
order by age asc
limit 0,9
(2)
鏈接:https://zhuanlan.hu.com/p/110924684
(1)
selectname,id,class,agefromtb_studentwhereyear(in_time)=2017andmajor='計算機'ORDERBYageASClimit10;
(2)
SELECTa.class,sum(casewhenaaa.x>80then1else0end)asnum_80,(sum(casewhenaaa.x>80then1else0end)/count(*))asproportionfromtb_studentaINNERJOIN(SELECTid,avg(score)asxfromtb_scoreGROUPBYid)asaaaona.id=aaa.idGROUPBYclass;
解析:寫一個子查詢,從score表中得到以學號分組的學生各科平均分。命名為aaa,將其與學生表內聯結。再以class分組,得到以class分組的各班學生的平均分,最後通過case語句,sum聚合函數得到平均分>80分的計數,和所佔各班總人數比例。
case語句也可以用if語句來代替
寫法2:
SELECTa.class,count(if(aaa.avg>80,true,null))asnumover80,count(if(aaa.avg>80,true,null))/count(a.id)astotalfromtb_studentaINNERJOIN(SELECTid,avg(score)asxfromtb_scoreGROUPBYid)asaaaona.id=aaa.idGROUPBYclass;
『伍』 查連續5天登陸的用戶,sql怎麼寫
新增用戶登陸日誌表(id、user_id、login_time、login_date);
用戶表新增連續登陸天數欄位(continuous_days);
用戶每次登陸往登陸日誌表insert記錄,並且查看昨天是否有登陸記錄,如果昨天登陸記錄大於0,則連續登陸天數+1,否則將連續登陸天數置為0;
sql語句:select * from user wherecontinuous_days > 5;
『陸』 如何用SQL解決連續幾天的問題
統計下用戶最長連續登錄的天數」,「統計下連續登錄超過10天的用戶」,「統計下連續3天交易額超過100W的店鋪
1. 連續兩天購買的用戶
先按照date將一天多次進行去重
row1:按照Date分組,time排序
row2:按照Date和ID分組,time排序
按照ID、row2-row1 分組,重復次數大於1
2. 比如連續2次購買的用戶()
row1:按照 time排序
row2:按照 ID 分組,time排序
按照ID、row2-row1 分組,重復次數大於1
2. 連續2次購買蘋果的用戶
row1:按照 time排序
row2:按照ID、商品類型分組,time排序
按照ID、商品類型分組,重復次數大於1
3. 連續2次在淘寶購買蘋果的用戶
row1:按照 time排序
row2:按照ID、商品類型、店鋪分組,time排序
按照ID、商品類型、店鋪分組,重復次數大於1
『柒』 有一張表記錄了用戶登錄的id和時間,怎麼找出每一個用戶連續登錄的天數
1、使用MR,第一個job(map以日期為key,對用戶進行分組輸出。rece設計:內部構造一個以N容量大小的列表(作為隊列),模擬一下啊(日期過來就是有序的,從小到大)
『捌』 sql怎樣統計不同用戶登錄的相同次數的用戶數
1000個用戶中:
0次登陸的用戶數990
1次登陸的用戶數2
5次登陸的用戶數5
7次登陸的用戶數3
-------------------------------------------------
用戶表users結構:
用戶名 密碼 login
------------------------------------------------
原理:最低用戶登陸的次數為0,最大為MAX所返回的值。順序查詢登陸次數相同的用戶數,是用Count函數得出。依次輸出結果。
declare @tmax int,@tmin int
set @tmax=(select max(login) from users)--獲取登陸最大次數
set @tmin=(select min(login) from users)--獲取登陸最小次數,可選語句,或設置為0
--循環統計結果
--set @tmax=125
print '最小登錄次數為'+Convert(varchar,@tmin)
print '最大登錄次數為'+Convert(varchar,@tmax)
print '--------------明細-------------------'
declare @current int,@countUser int
set @current=@tmin;
While(@current<=@tmax)
Begin
Select @countUser=Count(*) From users Where login=@current --查登陸次數為current的用戶數
if(@countUser>0) print Convert(varchar,@current)+'次登陸的用戶數'+Convert(varchar,@countUser)
--上一個語句只輸出有意義的數據結果
set @current=@current+1
End