SQL sever試題求最晚入職日期

2021-10-05 11:37:38 字數 1995 閱讀 6703

力扣上有這麼一道sql試題求最晚的入職日期。這裡簡單建立乙個表。

create

table employees

(name varchar(10

)not

null

,in_date date

notnull

)--indate表示入職日期

insert

into employees

values

('bob'

,'2019-11-20'),

('jam'

,'2020-01-02'),

('ming'

,'2020-02-02'),

('xia'

,'2020-02-25'),

('aim'

,'2020-02-25'

)

在確認入職日期沒有重複時,mysql可以用 limit 函式

select name , in_date from employees 

order

by in_date desc

limit0,

1

如果有相同的最晚入職日期,通用寫法可以這樣寫

select name , in_date from employees 

where in_date =

select

max(in_date)

from employees

但是sql sever目前好像還不支援limit函式,只支援top。那麼對於上述問題也可以改寫為(同樣是在沒有重複的情況下)

select

top1

*from employees order

by in_date desc

當然通用情況下也可以使用子查詢,改寫成

select

*from employees

where in_date =

(select

top1 in_date

from employees

order

by in_date desc

)

這裡在拓展一下,如果是要取倒數第三入職的資訊呢?mysql很方便可以使用limit

select name , in_date from employees 

order

by in_date desc

limit2,

1

但sql不支援,所以sql實現可能要麻煩一些,第一種可以使用top,首先倒序取出倒數後三名的資訊,再用top取出正序排名第一的就是入職倒數第三晚的。這裡表述可能不清,可以直接看**。

select

top1

*from

(select

top3

*from employees

order

by in_date desc

) t

order

by in_date

第二種可以用到視窗函式。rank(),dense_rank(),row_number()關於這三者排序的區別可以參考文章

**如下

select name,in_date 

from

(select name,in_date,

dense_rank(

)over

(order

by in_date desc

)as req

from employees) t

where req=

3

最後補充一下,第二種方法比較通用,不管有沒有重複資料都可行,且拓展性較高。如果將dense_rank改為row_number則可以實現任意取行,比如取倒數第8行,可以自行嘗試。

求最晚和最早日期

問題描述 輸入n個日期,每個以年 月 日的順序讀入,列印輸出最晚的日期 最早的日期。輸入說明 你的程式需要從標準輸入裝置 通常為鍵盤 中讀入多組測試資料。每組輸入資料由多行組成。每組測試資料的第一行輸入乙個整數n 0輸出說明 對每組測試資料,你的程式需要向標準輸出裝置 通常為啟動該程式的文字終端 輸...

29 求最晚和最早日期

29 求最晚和最早日期 問題描述 輸入n個日期,每個以年 月 日的順序讀入,列印輸出最晚的日期 最早的日期。輸入說明 你的程式需要從標準輸入裝置 通常為鍵盤 中讀入多組測試資料。每組輸入資料由多行組成。每組測試資料的第一行輸入乙個整數n 0輸出說明 對每組測試資料,你的程式需要向標準輸出裝置 通常為...

01 查詢最晚入職員工的所有資訊 題解

有乙個員工employees表簡況如下 建表語句如下 create table employees emp no int 11 notnull birth date date notnull first name varchar 14 not null last name varchar 16 no...