2 wuzangji0642 wuzangji0642 于 2018.01.03 22:27 提问

求助高手,sql较为复杂的排序 5C

原始数据
图片说明
排序后数据
图片说明
排序规则,这是一个公司的员工升迁降至记录。staff_id仅出现一次表示该员工职位没有变化,如jack.staff_id出现多次表示职位变化多次,如anna,ada.同一个人多次记录, date最大的记录表示最新的记录,其他都是历史记录,比如anna,201712是最新记录,201711的记录是历史记录。先按照每个人最新记录的position进行排序,
三个人最新的记录是
3 jack 6 201711
2 anna 6 201712
1 ada 7 201801
按照 position_id进行排序
3 jack 6 201711
2 anna 6 201712
1 ada 7 201801
(此时jack和anna的position-id是相同的,他们谁先谁后没关系)
用这个规则确定了员工的相对顺序,然后再对有多条记录的员工进行内部排序。
按照 date的倒叙,比如anna的201711的记录,因为比201712小,就把201711放在201712下面
3 jack 6 201711
2 anna 6 201712
2 anna 5 201711
1 ada 7 201801
然后是ada的两条记录
最后结果是
3 jack 6 201711
2 anna 6 201712
2 anna 5 201711
1 ada 7 201801
1 ada 6 201712
1 ada 5 201711
请问这个sql的order怎么写
select * from table order.....
如果用Java程序进行排序也是可以的

7个回答

appsna
appsna   2018.01.03 22:55

select * from table order by staff_id desc,date desc;
你所要的效果其实是先将staff_id倒序,在按照date倒序。看你的数据,写成下面这样也能出现同样的效果:
select * from table order by staff_name desc,date desc;

qq_34971827
qq_34971827 .
4 个月之前 回复
wuzangji0642
wuzangji0642 不是staff_id倒叙啊
4 个月之前 回复
u010367576
u010367576   2018.01.03 23:15

写联合查询排序,先按照你所述的position排序,再将这个结果作为数据集,再进行下一个字段的排序即可。依次类推,这样就达到你的效果的了。
案例
select * from (select * from (select* from 表 order by position_id) t order by t.字段 ) s order by s.字段

qq_37006078
qq_37006078   2018.01.04 00:51

select * from table order by staff_id desc,date desc;
你所要的效果其实是先将staff_id倒序,在按照date倒序。看你的数据,写成下面这样也能出现同样的效果:
select * from table order by staff_name desc,date desc;

wuzangji0642
wuzangji0642 排序不是按照staff_id倒叙,是按照position——id正序来排的,先按照每个人最新记录的position进行排序,最新的记录就是每个人date最大的记录
4 个月之前 回复
u011310182
u011310182   2018.01.04 09:40

select * from table order by staff_name desc,date desc; 同意楼上

wuzangji0642
wuzangji0642 排序不是按照staff_id倒叙,是按照position——id正序来排的,先按照每个人最新记录的position进行排序,最新的记录就是每个人date最大的记录
4 个月之前 回复
LYJLOVELSQ
LYJLOVELSQ   2018.01.04 09:41

在order by 后面按照排序顺序填写字段就可以了
select * from table order by staff_name desc,date desc;

wuzangji0642
wuzangji0642 排序不是按照staff_id倒叙,是按照position——id正序来排的,先按照每个人最新记录的position进行排序,最新的记录就是每个人date最大的记录
4 个月之前 回复
shenzhoustar
shenzhoustar   2018.01.04 12:56

select f.* from
t_test as f
join
(
select c.staff_id,@curRank:=@curRank+1 as rank from
(
select a.staff_id,a.position_id from
t_test as a
join
(select staff_id,max(date) as dt from t_test group by staff_id) as b
on a.staff_id=b.staff_id and a.date=b.dt
) as c,(select @curRank := 0) as d
order by c.position_id
) as e
on e.staff_id=f.staff_id
order by e.rank,f.date desc;

shenzhoustar
shenzhoustar 将t_test改成你的表名,这个sql在mysql上可以顺利执行;如果是其他数据库,可能会更简单;
4 个月之前 回复
it_zhangwei
it_zhangwei   2018.01.05 09:56

看了下你的回复,你说按照opsition-id来排序,按照opsitionid的最新事件来排序,那可能需要你的opsition表猜测下sql:select * from staff as s left join
opsition as o on s.opsition-id = o.id order by o.date desc ,s.opsition-id asc ,s.date desc ,s.staff-id desc .
如果使用java程序排序建议你使用jdk1.8新特性的stram 的lamdba来排序,大致写一个:list.stream().sort(comparing(对象:需要排序字段的get方法)).collecr(toList)

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!