569 員工薪水中位數

2021-10-24 23:59:24 字數 2958 閱讀 4402

employee 表包含所有員工。employee 表有三列:員工id,公司名和薪水。

idcompany

salary1a

23412a

3413a15

4a153145a

4516

a5137b

158b13

9b115410b

134511b

122112b

13413

c134514c

264515c

264516c

265217c

65請編寫sql查詢來查詢每個公司的薪水中位數。

挑戰點:你是否可以在不使用任何內建的sql函式的情況下解決此問題。

idcompany

salary15a

4516

a51312b

2349

b115414c

2645

題目條件

# nysql

drop

table

ifexists

`employee`

;create

table

`employee`

(`id`

int(11)

notnull

auto_increment

,`company`

varchar(20

)collate utf8_bin default

null

,`salary`

int(20)

default

null

,key

`id`

(`id`))

engine

=innodb

auto_increment=18

default

charset

=utf8 collate

=utf8_bin;

/*data for the table `employee` */

insert

into

`employee`

(`id`

,`company`

,`salary`

)values(1

,'a'

,2341),

(2,'a'

,341),

(3,'a',15

),(4

,'a'

,15314),

(5,'a'

,451),

(6,'a'

,513),

(7,'b',15

),(8

,'b',13

),(9

,'b'

,1154),

(10,'b'

,1345),

(11,'b'

,1221),

(12,'b'

,234),

(13,'c'

,2345),

(14,'c'

,2645),

(15,'c'

,2645),

(16,'c'

,2652),

(17,'c',65

);

使用 row_number ()函式

和 floor()函式

演算法第一步:

建立兩個新的column:乙個在每個company中排序,產生row number; 另乙個column是count這個company有多少員工。

# mysql

select

`id`

,`company`

,`salary`

, row_number (

)over

(partition

by`company`

order

by`salary`

asc,

`id`

asc)

as row_num,

count

(`id`

)over

(partition

by`company`

)as count_id

from

`employee`

;

結果

第二步:

使用floor()函式計算row_number = 中位數。

# mysql

select e.

`id`

,e.`company`

,e.`salary`

from

(select

`id`

,`company`

,`salary`

, row_number(

)over

(partition

by`company`

order

by`salary`

asc,

`id`

asc)

as row_num,

count

(`id`

)over

(partition

by`company`

)as count_id

from

`employee`

)as e

where e.row_num in

(floor(

(e.count_id +1)

/2), floor(

(e.count_id +2)

/2))

;

結果

leetcode569 員工薪水中位數

employee表包含所有員工。employee表有三列 員工id,公司名和薪水。id company salary 1 a 2341 2 a 341 3 a 15 4 a 15314 5 a 451 6 a 513 7 b 15 8 b 13 9 b 1154 10 b 1345 11 b 122...

LeetCode 569 員工薪水中位數

建表 drop table ifexists employee create table employee id int primary keyauto increment company char salary decimal insert into employee values 1 a 234...

員工薪水中位數

先用自定義變數分組排序,定義 num為序號,初始化為0,定義 last為上一行的部門,定義為null,然後進行查詢,num if last company,num 1,num num 1 如果上一家公司不等於現在這家公司,就重置num為1,否則增加1 注意 需要先按公司排序 不然公司是亂的 序號就會...