日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

sql datetime比较大小_SQL做题小技巧

發布時間:2023/12/15 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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差別比較大,所以為了做好筆試題,一般還得提前把日期函數復習一遍。

  • 從字符串生成日期

select datetime('2020-01-01 00:12:34'), date('2020-01-01 00:12:34'), time('2020-01-01 00:12:34');

  • 從unix時間戳生成日期

select datetime(0,'unixepoch'), date(0,'unixepoch'), time(0,'unixepoch');

select datetime(0,'unixepoch','utc'), date(0,'unixepoch','utc'), time(0,'unixepoch','utc');--?可以看出這里假設0的我們當地的時間戳,轉成日期之后,再轉換成utc的時間。

select datetime(0,'unixepoch','localtime'), date(0,'unixepoch','localtime'), time(0,'unixepoch','localtime');--?由于有localtime的轉換,所以這里0假設的是utc的時間。

  • 從日期轉換成其他形式的值

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至今秒數;

  • 日期加減

select datetime('now') as 當前, datetime('now','start of month') as 月初, datetime('now','start of month','+1 month','-1 day') as 月底, datetime('now', '+20 days') as 二十天后, datetime('now','+50 hours') as 五十小時后, datetime('now', 'start of year') as 年初, datetime('now', 'start of day') as 今天起始

掌握這些小技巧其實筆試題就能做大部分啦~

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的sql datetime比较大小_SQL做题小技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。