sql使用中的一些固定語法


#sql求分組后 組內排名前幾--每個uid在9月份登錄的前七天,與后7天(分別計算,不足7天的取全部)

SELECT * from ( SELECT  
 uid,
 day,
 @ROW := case when @cid=uid then @ROW+1 else 1 END rn, 
 @cid := uid
from 
(
  SELECT uid,day  from 
  ods_app_action_login_h 
  where day>="2019-09-01" and day <="2019-09-30" and uid <>''  
      GROUP BY day,uid ORDER BY uid,day desc
) l1,(SELECT @ROW := 0,@cid :=0) l2) l5
where rn <=7

--第二種
SELECT uid,day 
from ods_app_action_login_h as o1 
where day>="2019-09-27" and day<="2019-09-30" and 
 (
    SELECT count(*) from 
    (
       SELECT uid,day from ods_app_action_login_h where 
      day>="2019-09-27" and day<="2019-09-30" GROUP BY uid,day
      ) as o 
    where  o1.uid= o.uid and o.day <=o1.day   --分組排序
 ) <= 7 

 #從上一結果中篩選出isguest<>1的uid(當天只要有一條數據isguest=1,則此uid視為isguest=1,前7天后7天可任選一個)

SELECT * from 
(
    SELECT 
     uid,
     day,
     @ROW := case when @cid=uid then @ROW+1 else 1 END rn,
     @cid := uid
    from 
    (
        SELECT uid,day  from 
        ods_app_action_login_h 
        where day>="2019-09-01" and day <="2019-09-30" and uid <>''  GROUP BY day,uid ORDER BY uid,day desc
    ) l1,(SELECT @ROW := 0,@cid :=0) l2
) l5
INNER JOIN(
    SELECT uid,day from (        
       SELECT uid,sum(if(isguest!=1,0,1)) is_isguest,day from ods_app_action_login_h 
        where day>="2019-09-01" and day <="2019-09-30" GROUP BY uid,day
            ) s1 where s1.is_isguest=0
) l6 on l5.uid = l6.uid
where rn <=7


#下面效率不高

-- SELECT d1.uid,d1.isguest,d1.day from ods_app_action_login_h as d1
-- LEFT JOIN
-- (
-- SELECT * from (
-- SELECT uid,isguest,day from
-- ods_app_action_login_h
-- where day>="2019-09-29" and day <="2019-09-30" and uid <>'' GROUP BY uid,isguest,day) as o3 WHERE isguest !=1
-- ) l1 on l1.uid = d1.uid and l1.day =d1.day
-- where d1.day>="2019-09-29" and d1.day <="2019-09-30" GROUP BY uid
--

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM