1、多表之間關(guān)聯(lián)铅匹,并進(jìn)行分組后,某天的同個userid可能會被計入不同的分組饺藤,即使每個分組計數(shù)使用了distinct包斑,使用透視表,計算userid時涕俗,則該天userid會進(jìn)行多次計算罗丰。相對于單表取某天的userid,會出現(xiàn)偏大的情況
2再姑、排序函數(shù)區(qū)別
rank() OVER (partition by user_id order by ctime_datetime
ROW_NUMBER() OVER (partition by user_id order by ctime_datetime)
rank() over 碰到相同的萌抵,排序序號會相同,但是會占用序號元镀。
而row number()的序號都是唯一的
3绍填、區(qū)分新老用戶
可以用戶當(dāng)前時間與用戶出現(xiàn)的最小時間比較。若相等栖疑,則為新用戶(首次出現(xiàn))
4讨永、選擇唯一值
除了distinct,還可以依據(jù)時間排序遇革,取其中一個值
5卿闹、case when 嵌套使用
sum(case when overdue>2 and repay_create_at<=case when
6、group by
在返回集字段中萝快,這些字段要么就要包含在Group By語句的后面锻霎,作為分組的依據(jù);要么就要被包含在聚合函數(shù)中揪漩。
我們可以將Group By操作想象成如下的一個過程旋恼,首先系統(tǒng)根據(jù)SELECT 語句得到一個結(jié)果集,如最開始的那個水果奄容、出產(chǎn)國家冰更、單價的一個詳細(xì)表。然后根據(jù)分組字段嫩海,將具有相同分組字段的記錄歸并成了一條記錄冬殃。這個時候剩下的那些不存在于Group By語句后面作為分組依據(jù)的字段就有可能出現(xiàn)多個值,但是目前一種分組情況只有一條記錄叁怪,一個數(shù)據(jù)格是無法放入多個數(shù)值的审葬,所以這里就需要通過一定的處理將這些多值的列轉(zhuǎn)化成單值,然后將其放在對應(yīng)的數(shù)據(jù)格中奕谭,那么完成這個步驟的就是聚合函數(shù)涣觉。這就是為什么這些函數(shù)叫聚合函數(shù)(aggregate functions)了。
7血柳、COALESCE() 函數(shù)
返回其參數(shù)中第一個非空表達(dá)式官册。
[MS SQL]SQL表達(dá)式COALESCE講解
8、Divide by zero error encountered.
解決除數(shù)為0的報錯
How to avoid the “divide by zero” error in SQL?
SELECT COALESCE(2 / NULLIF(null,0), 0) #返回0
或者
Select dividend / nullif(divisor, 0) #返回空难捌,divisor可以為0或null
9膝宁、IFNULL(expr1,expr2)函數(shù)
如果expr1不是NULL,IFNULL()返回expr1,否則返回expr2
10鸦难、IF(expr1,expr2,expr3)
如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),則 IF()的返回值為expr2; 否則返回值則為 expr3员淫。
作為表達(dá)式的if也可以用CASE when來實(shí)現(xiàn)