sql datetime比较大小_SQL做题小技巧
數據分析必學必會當屬SQL取數,畢竟要分析首先需要有數嘛。
sql的語法教程往上一搜就有很多,本文主要將介紹幾個sql小技巧,靈活用上技能做對大部分的筆試題。
由于很多筆試是在牛客網上完成的,所以本文主要是用sqlite3的語法(實際上不同sql的區別主要只是在日期函數為主等函數上的差異)。
1.?with as 的使用
??? with as主要是為了代碼簡潔美觀,易讀易懂。主要用于創建臨時表,便于此后的查詢。
? ? 比如現在有個表是用戶消費表trade_tb,字段有user_id, trade_time, amount, 現在想統計找出哪一個用戶的消費金額最高,并輸出其消費金額。
? ? 如果不用with as創建臨時表,sql如下:
select user_id, max(total_amount) from ( select user_id, sum(amount) as total_amount from trade_tb group by user_id)??b-- 或者select user_id, sum(amount) as total_amountfrom trade_tbgroup by user_idorder by sum(amount) desclimit 1上述寫法可能在其他sql中不能運行,但在sqlite3中可以。一般來說,可能會通過下面的sql查詢得到。
select?user_id,?total_amountfrom ( select user_id, sum(amount) as total_amount from trade_tb group by user_id) aorder?by?total_amount desclimit?1;由于中間的代碼其實就是計算每個用戶的總金額,可以提取成臨時表,
with total_amount_tb as( select user_id, sum(amount) as total_amount from trade_tb group by user_id)select?user_id,?total_amountfrom?total_amount_tb?order by total_amount desclimit 1;with as 結構主要在代碼涉及到多個臨時表或者多重子查詢時使用。【沒有想到比較合適的例子,下次再補充】
2.?條件語句的使用
在sqlite3中,條件語句一般通過case when實現,在新版本的sqlite3中也有iif函數實現,不過筆試的平臺一般版本沒這么新,不支持iif函數。
假如現在有學生期末成績表score_tb,字段為stu_id, course, score,假設每個學生每門課僅有一次考試成績。現在想取出每個學生的語文、數學、英語考試成績。
select stu_id, sum(case course when '語文' then score else null end) as 語文成績, max(case course when '數學' then score else null end) as 數學成績, avg(case course when '英語' then score else null end) as 英語成績from score_tbgroup by stu_id;這里,由于限制了每個學生在每門課上至多有一次成績,所以用上聚合函數sum()/max()/min()/avg()的結果都是一致的。
3.?窗口函數的使用
窗口函數一般可以為排序類的函數rank()/dense_rank()/row_number(),也可以為sum()/avg()等聚合函數。
一般的筆試題目可以通過使用排序類的函數來簡化實現。
查詢消費總額第3的用戶:
with total_amount_tb as( select user_id, sum(amount) as total_amount from trade_tb group by user_id),total_amount_rank_tb as( select user_id, total_amount, rank() over (order by total_amount desc) as rnk from total_amount_tb)select user_id, total_amountfrom total_amount_rank_tbwhere rnk = 3;取出每門成績前2的學生及其對應的成績:
with score_rank_tb as( select stu_id, course, score, rank() over (partition by course order by score desc) rnk from score_tb)select course, score, stu_id, rnkfrom score_rank_tbwhere rnk <= 2order?by?course另外,注意區分rank()/dense_rank()/row_number()的區別:
select stu_id, course, score, rank() over (partition by course order by score desc) rnk, dense_rank() over (partition by course order by score desc) dense_rnk, row_number() over (partition by course order by score desc) row_numfrom score_tb2也就是可以看到,對于成績相同的排序,rank()和dense_rank()取的是相同的名次,但是對于下一個成績,rank()是累加前面的總人數得到下一個名次,而dense_rank()是累加前面的數字個數得到的下一個名次,而row_number()則表示行數,根據排序的結果給每一行標注行號。
4. 日期時間函數的使用
sql的題目有時會出現一些需要通過日期函數表達的,這時候就會出現很多問題,因為不同的sql時間函數存在一些差異,特別是sqlite3的日期函數跟其他sql差別比較大,所以為了做好筆試題,一般還得提前把日期函數復習一遍。
從字符串生成日期
從unix時間戳生成日期
從日期轉換成其他形式的值
strftime(format, timestring)實際上就是將日期轉換成其他表示形式。
select strftime('%Y-%m-%d %H:%M:%S','2020-01-02 04:15:36') as 日期時間, strftime('%f','2020-01-02 04:15:36') as 帶小數點的秒, strftime('%j','2020-01-02 04:15:36') as 一年第幾天, strftime('%J','2020-01-02 04:15:36') as 從JulianDay至今天數,???????strftime('%s','2020-01-02?04:15:36')?as?從19700101至今秒數;日期加減
掌握這些小技巧其實筆試題就能做大部分啦~
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的sql datetime比较大小_SQL做题小技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java如何创建文件?java创建文件流
- 下一篇: idea撤销与恢复快捷键_Intelli