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 注意 需要先按公司排序 不然公司是亂的 序號就會...